#c# #.net #winforms #picturebox
#c# #.net #winforms #picturebox
Вопрос:
Я новичок в c #. У меня есть изображение в picturebox, я хотел бы нарисовать прямоугольник на изображении, чтобы зафиксировать координаты X, Y и ширину / высоту прямоугольника, который я буду рисовать (на фоне изображения в picturebox). я знаю, что должен что-то сделать в pictureBox1_MouseEnter .. и т.д. Но я не знаю, с чего начать.
private void pictureBox1_MouseEnter(object sender, EventArgs e)
{
Rectangle Rect = RectangleToScreen(this.ClientRectangle);
}
Я был бы признателен, если кто-нибудь может дать мне пример кода.
Спасибо.
Ответ №1:
Вы вообще не хотите использовать MouseEnter
. Вы хотите использовать MouseDown
, потому что вы не хотите начинать отслеживать прямоугольник, который рисует пользователь, до тех пор, пока он не нажмет кнопку мыши.
Итак, в MouseDown
методе обработчика событий сохраните текущие координаты курсора. Это начальное положение прямоугольника, точки (X, Y).
private Point initialMousePos;
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
this.initialMousePos = e.Location;
}
И затем, в MouseUp
событии, которое возникает, когда пользователь прекращает перетаскивание и отпускает кнопку мыши, вы хотите сохранить конечную точку курсора мыши и объединить ее с начальной отправной точкой для построения прямоугольника. Самый простой способ построить такой прямоугольник — использовать FromLTRB
статический метод Rectangle
класса:
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
// Save the final position of the mouse
Point finalMousePos = e.Location;
// Create the rectangle from the two points
Rectangle drawnRect = Rectangle.FromLTRB(
this.initialMousePos.X,
this.initialMousePos.Y,
finalMousePos.X,
finalMousePos.Y);
// Do whatever you want with the rectangle here
// ...
}
Вероятно, вы захотите объединить это с некоторым кодом рисования в MouseMove
методе обработчика событий, чтобы предоставить пользователю визуальную индикацию прямоугольника, который они рисуют, пока они его рисуют.
Правильный способ сделать это — обработать MouseMove
событие, чтобы получить текущее положение мыши, а затем вызвать Invalidate
метод, который вызовет Paint
событие. Весь ваш код рисования должен быть в Paint
обработчике событий. Это лучший подход, чем тот, который используется во многих примерах, которые вы найдете в Интернете, где вы увидите что-то вроде CreateGraphics
вызываемого внутри MouseMove
метода обработчика событий. Избегайте этого, если возможно.
Пример реализации:
private Point currentMousePos;
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
// Save the current position of the mouse
currentMousePos = e.Location;
// Force the picture box to be repainted
pictureBox1.Invalidate();
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
// Create a pen object that we'll use to draw
// (change these parameters to make it any color and size you want)
using (Pen p = new Pen(Color.Blue, 3.0F))
{
// Create a rectangle with the initial cursor location as the upper-left
// point, and the current cursor location as the bottom-right point
Rectangle currentRect = Rectangle.FromLTRB(
this.initialMousePos.X,
this.initialMousePos.Y,
currentMousePos.X,
currentMousePos.Y);
// Draw the rectangle
e.Graphics.DrawRectangle(p, currentRect);
}
}
Пара моментов, на которые следует обратить внимание в этом коде, если вы никогда раньше не рисовали никаких типов. Во-первых, я заключил создание Pen
объекта (который мы используем для выполнения фактического рисования) в using
инструкцию. Это хорошая общая практика всякий раз, когда вы создаете объект, который реализует IDisposable
интерфейс, такой как кисти и перья, чтобы предотвратить утечку памяти в вашем приложении.
Кроме того, PaintEventArgs
предоставляет нам экземпляр Graphics
класса, который инкапсулирует все базовые функции рисования в приложении .NET. Все, что вам нужно сделать, это вызвать такие методы, как DrawRectangle
или DrawImage
, в этом экземпляре класса, передав соответствующие объекты в качестве параметров, и весь рисунок будет выполнен за вас автоматически. Достаточно просто, не так ли?
И, наконец, обратите внимание, что мы сделали здесь точно то же самое для создания прямоугольника, что мы в конечном итоге делаем в MouseUp
методе обработчика событий. Это имеет смысл, потому что нам просто нужен мгновенный размер прямоугольника, пока пользователь его создает.
Комментарии:
1. спасибо, Коди, ваш код работает нормально, не могли бы вы дать мне краткий образец для рисования?
2. @Kelly: Обновлено образцом рисования. Не уверен, насколько вы знакомы с такого рода вещами в . СЕТЕВОЙ мир, поэтому я попытался объяснить это как можно лучше. Пожалуйста, оставьте комментарий, если у вас есть еще вопросы!