我寻找既简单又有效的示例代码,但没有找到任何东西。您不需要屏幕外位图或CreateGraphics
为此,但您需要按照 Eric 的建议处理跟踪鼠标位置、绘制到屏幕以及将绘制的形状添加到形状列表中。要处理交互式绘图,您需要在表单处理程序中存储鼠标状态、初始单击位置和当前矩形:
bool mouseDown;
Point clickPos;
Rectangle rect;
然后当用户点击时,记住初始位置:
private void MouseDown(object sender, MouseEventArgs e)
{
mouseDown = true;
clickPos = e.Location;
rect = new Rectangle(clickPos, new Size(0, 0));
}
当用户用鼠标向下拖动时,创建一个包含开始位置和当前位置的矩形:
private void MouseMove(object sender, MouseEventArgs e)
{
if (mouseDown)
{
this.Invalidate(rect);
if (e.Location.X > clickPos.X && e.Location.Y > clickPos.Y)
{
rect = new Rectangle(clickPos.X, clickPos.Y, e.Location.X - clickPos.X, e.Location.Y - clickPos.Y);
}
else if (e.Location.X > clickPos.X && e.Location.Y < clickPos.Y)
{
rect = new Rectangle(clickPos.X, e.Location.Y, e.Location.X - clickPos.X, clickPos.Y - e.Location.Y);
}
else if (e.Location.X < clickPos.X && e.Location.Y < clickPos.Y)
{
rect = new Rectangle(e.Location.X, e.Location.Y, clickPos.X - e.Location.X, clickPos.Y - e.Location.Y);
}
else if (e.Location.X < clickPos.X && e.Location.Y > clickPos.Y)
{
rect = new Rectangle(e.Location.X, clickPos.Y, clickPos.X - e.Location.X, e.Location.Y - clickPos.Y);
}
this.Invalidate(rect);
}
}
当用户释放鼠标时,停止绘制:
private void MouseUp(object sender, MouseEventArgs e)
{
mouseDown = false;
}
Windows 窗体中最重要的第一条规则是:仅在 Paint 事件中绘制到屏幕。永远不要画在MouseMoved
event:
private void Paint(object sender, PaintEventArgs e)
{
e.Graphics.FillRectangle(Brushes.DarkGray, rect);
}
一旦你开始工作,创建一个表单List<Rectangle>
并将当前矩形添加到MouseUp
事件并绘制所有矩形Paint
事件。您可能还想将绘图剪辑到您正在其中绘图的面板或窗口。您还可以在以下位置进行一些优化:MouseMoved
仅使更改的屏幕区域无效,而不使旧的和新的矩形都无效。