C # Windows Forms.Подвижные области на PictureBox - PullRequest
1 голос
/ 09 февраля 2011

Я работаю с изображениями вроде: http://imgur.com/a2VKb

Мне удалось найти вертикальную линию между страницами на отсканированном изображении.Но иногда возникают некоторые ошибки, и мне нужно сделать опцию для пользователя, чтобы изменить эту позицию линии и угол.Я думаю, что это было бы хорошо в PictureBox.

Мне нужно как-то нарисовать линию между двумя подвижными точками на картинке с текущим изображением.Когда я перемещаю точку, положение линии и ее угол должны быть изменены должным образом.

Ответы [ 2 ]

2 голосов
/ 10 февраля 2011

Вот пример кода, который вы можете использовать для своих нужд. В основном используются 4 события:
- Краска
- MouseDown
- MouseMove
- MouseUp

Вы можете скопировать и вставить этот код в форму с именем Form1, с графическим блоком с именем pictureBox1

</p> <pre><code> int handleRadius = 3; int mPointMoveInProgress = 0; Point mPoint1, mPoint2; public Form1() { InitializeComponent(); mPoint1 = new Point(50, 50); // Set correct default values mPoint1 = new Point(50, 300); // Set correct default values } private void pictureBox1_Paint(object sender, PaintEventArgs e) { // Draw line e.Graphics.DrawLine(new Pen(Color.Black, 2), mPoint1, mPoint2); Rectangle rectangle; // Draw first handle rectangle = new Rectangle(mPoint1.X - handleRadius, mPoint1.Y - handleRadius, handleRadius * 2, handleRadius * 2); e.Graphics.FillRectangle(Brushes.White, rectangle); e.Graphics.DrawRectangle(Pens.Black, rectangle); // Draw second handle rectangle = new Rectangle(mPoint2.X - handleRadius, mPoint2.Y - handleRadius, handleRadius * 2, handleRadius * 2); e.Graphics.FillRectangle(Brushes.White, rectangle); e.Graphics.DrawRectangle(Pens.Black, rectangle); } private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { // Determine if a point is under the cursor. If so, declare that a move is in progress if (Math.Abs(e.X - mPoint1.X) < handleRadius && Math.Abs(e.Y - mPoint1.Y) < handleRadius) mPointMoveInProgress = 1; else if (Math.Abs(e.X - mPoint2.X) < handleRadius && Math.Abs(e.Y - mPoint2.Y) < handleRadius) mPointMoveInProgress = 2; else mPointMoveInProgress = 0; } private void pictureBox1_MouseMove(object sender, MouseEventArgs e) { if (mPointMoveInProgress == 1) // If moving first point { mPoint1.X = e.X ; mPoint1.Y = e.Y ; Refresh(); } else if (mPointMoveInProgress == 2) // If moving second point { mPoint2.X = e.X ; mPoint2.Y = e.Y ; Refresh(); } else // If moving in the PictureBox: change cursor to hand if above a handle { if (Math.Abs(e.X - mPoint1.X) < handleRadius && Math.Abs(e.Y - mPoint1.Y) < handleRadius) Cursor.Current = Cursors.Hand; else if (Math.Abs(e.X - mPoint2.X) < handleRadius && Math.Abs(e.Y - mPoint2.Y) < handleRadius) Cursor.Current = Cursors.Hand; else Cursor.Current = Cursors.Default; } } private void pictureBox1_MouseUp(object sender, MouseEventArgs e) { // Declare that no move is in progress mPointMoveInProgress = 0; }

1 голос
/ 09 февраля 2011

использовать класс Graphics.

при появлении новых событий рисования (в обработчике перемещения мыши или там, где это необходимо):

// we don't need to change imageSource 
Image imgSourceCopy = imageSource.Clone as Image;

Graphics g = Graphics.FromImage(imgSourceCopy);

g.DrawLine(point1, point2);
pictureBox.Image = imgSourceCopy;

imgSourceCopy используется только для рисования линии.ps привет из Львова:)

...