我想要绘制一个矩形。我希望在鼠标事件上显示给用户这个矩形,就像图片中所示。这是针对C# .net窗体应用程序的。请帮助我实现这个功能。感谢您的任何帮助。
谢谢
Yohan
我想要绘制一个矩形。我希望在鼠标事件上显示给用户这个矩形,就像图片中所示。这是针对C# .net窗体应用程序的。请帮助我实现这个功能。感谢您的任何帮助。
谢谢
Yohan
您可以按照以下三个步骤进行操作:
您可以像这样做(在您的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设计器的工作方式。示例代码在此处。