[英]Draw rectangle with mouse
有没有办法用起点和终点而不是起点和面积来绘制矩形? 我正在使用以下代码,通过鼠标在窗体上绘制矩形:
System.Drawing.Graphics formGraphics;
bool isDown = false;
int initialX;
int initialY;
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
isDown = true;
initialX = e.X;
initialY = e.Y;
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (isDown == true)
{
this.Refresh();
Pen drwaPen = new Pen(Color.Navy,1);
int width = e.X - initialX, height = e.Y - initialY;
//if (Math.Sign (width) == -1) width = width
//Rectangle rect = new Rectangle(initialPt.X, initialPt.Y, Cursor.Position.X - initialPt.X, Cursor.Position.Y - initialPt.Y);
Rectangle rect = new Rectangle(initialX, initialY, width * Math.Sign(width), height * Math.Sign(height));
formGraphics = this.CreateGraphics();
formGraphics.DrawRectangle(drwaPen, rect);
}
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
isDown = false;
}
我可以使用此代码绘制矩形,当我将鼠标从其起点移回该矩形时,该矩形应翻转,但我没有继续这样做,而是继续沿与鼠标光标相反的方向绘制矩形。 简而言之,此代码在向前绘制矩形时效果很好,但向后绘制则无效。
正如Jamiec所述,只需在MouseMove
处理程序中调用Invalidate
,然后在OnPaint
方法/ Paint
事件处理程序中进行Paint
要向前或向后绘制正确的矩形,请尝试以下操作:
Rectangle rect = new Rectangle(Math.Min(e.X, initialX),
Math.Min(e.Y, initialY),
Math.Abs(e.X - initialX),
Math.Abs(e.Y - initialY));
尝试这个:
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
IsMouseDown = true; // If This Event Is Occured So This Variable Is True.
LocationXY = e.Location; // Get The Starting Location Of Point X and Y.
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (IsMouseDown == true) // This Block Is Not Execute Until Mouse Down Event Is Not a Fire.
{
LocationX1Y1 = e.Location; // Get The Current Location Of Point X and Y.
Refresh(); // Refresh the form.
}
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
if(IsMouseDown == true) // This Block Is Not Execute Until Mouse Down Event Is Not a Fire.
{
LocationX1Y1 = e.Location; // Get The Ending Point of X and Y.
IsMouseDown = false; // false this..
}
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
if (rect != null) // Check If Rectangle Is Not a null.
{
e.Graphics.DrawRectangle(Pens.Red, GetRect()); // GetRect() Is a Function, Now Creates this function.
}
}
private Rectangle GetRect()
{
//Create Object Of rect. we define rect at TOP.
rect = new Rectangle();
//The x-value of our Rectangle should be the minimum between the start x-value and the current x-position.
rect.X = Math.Min(LocationXY.X, LocationX1Y1.X);
//same as above x-value. The y-value of our Rectangle should be the minimum between the start y-value and the current y-position.
rect.Y = Math.Min(LocationXY.Y, LocationX1Y1.Y);
//the width of our rectangle should be the maximum between the start x-position and current x-position MINUS.
rect.Width = Math.Abs(LocationXY.X - LocationX1Y1.X);
rect.Height = Math.Abs(LocationXY.Y - LocationX1Y1.Y);
return rect;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.