我在这里找到了用于在表单上绘图的示例代码:
http://msdn.microsoft.com/en-us/library/aa287522(v=vs.71).aspx
作为此要求的后续措施(发现哪些控件位于用户拖动鼠标描述的矩形下方):
我的控件位置与 MouseDown 和 -Up 事件的位置之间似乎不匹配
...我想向用户提供关于他们将要选择的内容的即时/持续反馈(何时/如果他们释放鼠标按钮)。我不仅想在鼠标移动之后画一条线,还想画出他们的鼠标争吵所描述的矩形。
我在想 MouseMove 事件,再加上上面两个链接中的代码,可以解决问题,但是触发太频繁/会对性能产生恶意影响吗?如果是这样,什么是更可取的挂钩事件,或者计时器会是去这里的方式吗?
更新
这段代码改编自下面 John 的示例(唯一的区别是 StackOverflow 引发的对 base.* 的调用被注释掉了,我将颜色从红色更改为黑色(不打算参考 Stendahl)),除了之前绘制的矩形松开鼠标后再次显示。IOW,第一个矩形绘制完美 - 它随着鼠标向上单击而消失(如预期的那样)。但是,当我通过按下鼠标左键并向下和向右拖动来描述第二个矩形时,第一个矩形再次显示!并且这种情况继续发生 -每个先前绘制的矩形都会被记住并在绘制新矩形时重新出现。
公共部分类Form1:表格{私人点?_开始; 私人矩形_previousBounds;
public Form1()
{
InitializeComponent();
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
_start = e.Location;
//base.OnMouseDown(e);
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (_start.HasValue)
DrawFrame(e.Location);
//base.OnMouseMove(e);
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
ReverseFrame();
_start = null;
//base.OnMouseUp(e);
}
private void ReverseFrame()
{
ControlPaint.DrawReversibleFrame(_previousBounds, Color.Black, FrameStyle.Dashed);
}
private void DrawFrame(Point end)
{
ReverseFrame();
var size = new Size(end.X - _start.Value.X, end.Y - _start.Value.Y);
_previousBounds = new Rectangle(_start.Value, size);
_previousBounds = this.RectangleToScreen(_previousBounds);
ControlPaint.DrawReversibleFrame(_previousBounds, Color.Black, FrameStyle.Dashed);
}
}