如何根据鼠标的移动绘制矩形

本文关键字:绘制 移动 何根 鼠标 | 更新日期: 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);
}