如何根据鼠标的移动绘制矩形
本文关键字:绘制 移动 何根 鼠标 | 更新日期: 2023-09-27 18:32:47
>我在这里找到了用于在表单上绘图的示例代码:
http://msdn.microsoft.com/en-us/library/aa287522(v=vs.71(.aspx
作为此要求的后续工作(发现哪些控件位于拖动鼠标的用户(:
我的控件的位置与鼠标按下和 -Up 事件的位置之间似乎
不匹配。我想为用户提供有关他们将要选择的内容的即时/持续反馈(当他们/如果他们释放鼠标按钮时(。我不仅想在鼠标的后面画一条线移动,但绘制由他们的鼠标争吵努力描述的矩形。
我认为 MouseMove 事件以及上面两个链接中的代码可以解决问题,但这是否太频繁触发/这会对性能产生恶意影响?如果是这样,钩子更可取的事件是什么,或者计时器是这里的方式?
更新
这段代码改编自 John 下面的示例(唯一的区别是 StackOverflow 诱导对 base.* 的调用被注释掉了,我将颜色从红色更改为黑色(无意引用 Stendahl((,除了之前绘制的矩形在释放鼠标后再次显示之外,其他工作。IOW,第一个矩形绘制完美 - 它随着鼠标向上单击而消失(如预期的那样(。但是,当我通过按下鼠标左键并向下和向右拖动来描述第二个矩形时,第一个矩形再次显示!这种情况继续发生 - 每个以前绘制的矩形都会被记住,并在绘制新矩形时重新突出显示。
公共分部类 表格 1 : 表格{ 私人点?_开始; 私人矩形_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);
}
}
>ControlPaint.DrawReversibleFrame()
会做你想做的事。 性能通常不是问题 - 只需保持小巧干净即可。
--编辑:添加了代码示例。 StackOverflowException表示有问题 - 但没有看到你的,无法直接回答。
private Point? _start;
private Rectangle _previousBounds;
protected override void OnMouseDown(MouseEventArgs e)
{
_start = e.Location;
base.OnMouseDown(e);
}
protected override void OnMouseMove(MouseEventArgs e)
{
if( _start.HasValue ) {
ReverseFrame();
DrawFrame(e.Location);
}
base.OnMouseMove(e);
}
protected override void OnMouseUp(MouseEventArgs e)
{
ReverseFrame();
_start = null;
base.OnMouseUp(e);
}
private void ReverseFrame()
{
ControlPaint.DrawReversibleFrame(_previousBounds, Color.Red, 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.Red, FrameStyle.Dashed);
}