Я хочу нарисовать прямоугольник. Я хочу, чтобы пользователь показывал прямоугольник на событии мыши.
Как на картинке. Это для приложения C # .net Forms.
Помогите мне добиться этого. Любая помощь приветствуется.
Спасибо, Йохан
Я хочу нарисовать прямоугольник. Я хочу, чтобы пользователь показывал прямоугольник на событии мыши.
Как на картинке. Это для приложения C # .net Forms.
Помогите мне добиться этого. Любая помощь приветствуется.
Спасибо, Йохан
Вы можете сделать это в три этапа:
Вы можете сделать что-то вроде этого (в своем Form
):
public class Form1
{
Rectangle mRect;
public Form1()
{
InitializeComponents();
//Improves prformance and reduces flickering
this.DoubleBuffered = true;
}
//Initiate rectangle with mouse down event
protected override void OnMouseDown(MouseEventArgs e)
{
mRect = new Rectangle(e.X, e.Y, 0, 0);
this.Invalidate();
}
//check if mouse is down and being draged, then draw rectangle
protected override void OnMouseMove(MouseEventArgs e)
{
if( e.Button == MouseButtons.Left)
{
mRect = new Rectangle(mRect.Left, mRect.Top, e.X - mRect.Left, e.Y - mRect.Top);
this.Invalidate();
}
}
//draw the rectangle on paint event
protected override void OnPaint(PaintEventArgs e)
{
//Draw a rectangle with 2pixel wide line
using(Pen pen = new Pen(Color.Red, 2))
{
e.Graphics.DrawRectangle(pen, mRect);
}
}
}
позже, если вы захотите проверить, находятся ли кнопки (показанные на схеме) в прямоугольнике или нет, вы можете сделать это, проверив область кнопки и проверив, лежат ли они в нарисованном прямоугольнике.
Решение от Shekhar_Pro рисует прямоугольник только в одном направлении (сверху вниз, слева направо), если вы хотите рисовать прямоугольник независимо от положения мыши и направления движения, решение:
Point selPoint;
Rectangle mRect;
void OnMouseDown(object sender, MouseEventArgs e)
{
selPoint = e.Location;
// add it to AutoScrollPosition if your control is scrollable
}
void OnMouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
Point p = e.Location;
int x = Math.Min(selPoint.X, p.X)
int y = Math.Min(selPoint.Y, p.Y)
int w = Math.Abs(p.X - selPoint.X);
int h = Math.Abs(p.Y - selPoint.Y);
mRect = new Rectangle(x, y, w, h);
this.Invalidate();
}
}
void OnPaint(object sender, PaintEventArgs e)
{
e.Graphics.DrawRectangle(Pens.Blue, mRect);
}
Эти синие прямоугольники очень похожи на элементы управления. В Winforms сложно нарисовать линию поверх элемента управления. Вы должны создать прозрачное окно, которое перекрывает поверхность конструктора, и нарисовать прямоугольник в этом окне. Так же работает и дизайнер Winforms. Пример кода находится здесь а>.