【发布时间】:2014-08-17 11:12:11
【问题描述】:
我有这个代码:
private void pictureBoxSnap_Paint(object sender, PaintEventArgs e)
{
if (pictureBoxSnap.Image != null)
{
if (btn == true)
{
if (Rect != null && Rect.Width > 0 && Rect.Height > 0)
{
e.Graphics.DrawRectangle(pen, Rect);
}
}
}
}
private void pictureBoxSnap_MouseMove(object sender, MouseEventArgs e)
{
if (btn == true)
{
if (e.Button == MouseButtons.Left)
return;
Point tempEndPoint = e.Location;
Rect.Location = new Point(
Math.Min(RectStartPoint.X, tempEndPoint.X),
Math.Min(RectStartPoint.Y, tempEndPoint.Y));
Rect.Size = new Size(
Math.Abs(RectStartPoint.X - tempEndPoint.X),
Math.Abs(RectStartPoint.Y - tempEndPoint.Y));
pictureBoxSnap.Invalidate();
}
}
private void pictureBoxSnap_MouseDown(object sender, MouseEventArgs e)
{
btn = !btn;
}
我想做的是两件事:
当我第一次单击鼠标左键时,
RectStartPoint X和Y应该是鼠标光标所在的位置。然后我移动鼠标,矩形变大或变小,然后当我再次单击鼠标左键时,将矩形保持在最后一个鼠标光标所在的大小上。我该怎么办? 现在它一直从 0,0 开始,RectStartPoint将是 0,0 如果我将其更改为e.Location.X和Y而不是RectStartPoint它不会画任何东西。第二件事是当我第一次单击鼠标左键并更改矩形大小时,如果我将继续移动鼠标并同时再次单击鼠标左键,矩形将消失/删除。如果我不移动鼠标,只需左键单击按钮,矩形将保持不变。为什么我在删除矩形的同时移动鼠标并单击左键?
【问题讨论】:
-
您应该将鼠标的位置存储到
MouseDown中的类级别变量(属性)中,并在MouseMove事件中作为起点使用它作为起点 -
bansi 这正在工作,感谢存储,它工作得很好。第二个问题或者如果我在快速绘制/显示矩形时移动鼠标并单击鼠标左键矩形消失/删除,这可能是正常的。那是什么?如果我绘制矩形并再次缓慢单击鼠标左键,则矩形保持原样。但是,如果我在快速移动鼠标时单击鼠标左键,则矩形将被删除。
-
我从未尝试在鼠标移动事件上绘图,
pictureBoxSnap.Invalidate();重绘图片框。我通常会在pictureBoxSnap的Paint事件中绘制矩形。我只想存储矩形点,是否需要在MouseMove事件中绘制矩形而不是绘制。 -
bansi 自己的绘制已经在绘制事件中了。如果我从移动事件中删除无效,那么它将永远不会到达绘画事件。我应该在哪里放置/添加图片框的无效?
-
if (Rect != null && Rect.Width > 0 && Rect.Height > 0)在您单击而不移动后阻止绘图。现在,当您这样做时应该会发生什么?矩形应该消失,它应该改变还是什么都不发生?