0

我在这里找到了用于在表单上绘图的示例代码:

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); 
} 

}

4

1 回答 1

1

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);
}
于 2012-04-29T17:46:03.227 回答