2015-08-15 2 views
1

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

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

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

Спасибо!

Это мой код для справки:

private void pbImage_Click(object sender, EventArgs e) 
    { 
     //Note: pbImage is the name of the picture box used here. 
     var mouseEventArgs = e as MouseEventArgs; 
     int x = mouseEventArgs.Location.X; 
     int y = mouseEventArgs.Location.Y; 

     // We first cast the "Image" property of the pbImage picture box control 
     // into a Bitmap object. 
     Bitmap pbImageBitmap = (Bitmap)(pbImage.Image); 
     // Obtain a Graphics object from the Bitmap object. 
     Graphics graphics = Graphics.FromImage((Image)pbImageBitmap); 

     Pen whitePen = new Pen(Color.White, 1); 
     // Show the coordinates of the mouse click on the label, label1. 
     label1.Text = "X: " + x + " Y: " + y; 
     Rectangle rect = new Rectangle(x, y, 200, 200); 

     // Draw the rectangle, starting with the given coordinates, on the picture box. 
     graphics.DrawRectangle(whitePen, rect); 

     // Refresh the picture box control in order that 
     // our graphics operation can be rendered. 
     pbImage.Refresh(); 

     // Calling Dispose() is like calling the destructor of the respective object. 
     // Dispose() clears all resources associated with the object, but the object still remains in memory 
     // until the system garbage-collects it. 
     graphics.Dispose(); 
    } 

UPDATE 12:55 утра, 16/8/2015 - Я знаю, почему! Свойство SizeMode для pictureBox было установлено на StretchImage. Изменил его в нормальном режиме, и он работал нормально. Не совсем понятно, почему это так, я обязательно посмотрю.

Тем, кто ответил, большое вам спасибо за помощь! :)

ответ

2

Первые два аргумента конструктора Rectangle являются координатами верхнего левого (не центра).

и обрабатывать мыши и краски событий по отдельности:

int mouseX, mouseY; 

private void pbImage_MouseDown(object sender, MouseEventArgs e) 
{ 
    mouseX = e.X; 
    mouseY = e.Y; 
    pbImage.Refresh(); 
} 

private void pbImage_Paint(object sender, PaintEventArgs e) 
{ 
    //... your other stuff 
    Rectangle rect = new Rectangle(mouseX - 100, mouseY - 100, 200, 200); 
    e.Graphics.DrawRectangle(whitePen, rect); 
} 
0

Вы меняете EventArgs на MouseEventArgs, я думаю, что это неверно. Вы пытаетесь с событиями MouseDown или MouseUp контроля изображения? Эти события предоставляют вам необходимую информацию.