从屏幕上删除DrawReversibleFrame

时间:2017-07-06 03:23:10

标签: c# .net

我在从屏幕上删除DrawReversibleFrame时遇到问题。文档说两次输入该函数以删除它,但似乎它不适用于我的逻辑布局。

using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApp6
{
public partial class Form1 : Form
{
    private Point? _start;
    private Rectangle _previousBounds;

    public Form1()
    {
        InitializeComponent();
    }

    private void OnMouseDown(object sender,MouseEventArgs e)
    {
        _start = e.Location;
    }

    private void OnMouseMove(object sender,MouseEventArgs e)
    {
        if (_start.HasValue)
        {
            ReverseFrame();
            DrawFrame(e.Location);
        }
    }

    private void OnMouseUp(object sender,MouseEventArgs e)
    {
        ReverseFrame();
        _start = null;
    }

    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 = RectangleToScreen(_previousBounds);
        ControlPaint.DrawReversibleFrame(_previousBounds, Color.Red, FrameStyle.Dashed);
    }
}
}

当我在表单上拖动鼠标时,这是我的结果。 http://imgur.com/a/Kh4h7

pesudo代码应该像我一样工作,我觉得我在做。

的MouseDown:

绘制矩形。

保存矩形边界。

-

MouseMove(带左按钮):

重绘以前的矩形以进行擦除。

计算下一个矩形。

绘制下一个矩形。

保存矩形边界。

冲洗/重复(无限期)

-

的MouseUp:

重绘最后一个要擦除的矩形。

1 个答案:

答案 0 :(得分:0)

查看this example

示例中的MouseUp处理程序是兴趣点。

 private void Form1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            // If the MouseUp event occurs, the user is not dragging.
            isDrag = false;

            // Draw the rectangle to be evaluated. Set a dashed frame style 
            // using the FrameStyle enumeration.
            ControlPaint.DrawReversibleFrame(theRectangle, this.BackColor, FrameStyle.Dashed);

            // Find out which controls intersect the rectangle and 
            // change their color. The method uses the RectangleToScreen  
            // method to convert the Control's client coordinates 
            // to screen coordinates.
            Rectangle controlRectangle;
            for (int i = 0; i < Controls.Count; i++)
            {
                controlRectangle = Controls[i].RectangleToScreen(Controls[i].ClientRectangle);
                if (controlRectangle.IntersectsWith(theRectangle))
                {
                    Controls[i].BackColor = Color.BurlyWood;
                }
            }

            // Reset the rectangle.
            theRectangle = new Rectangle(0, 0, 0, 0);
        }

具体来说,我在测试时将以下行置于评论之下并获得与您相同的结果。

// ControlPaint.DrawReversibleFrame(theRectangle, this.BackColor, FrameStyle.Dashed);

<强>更新

我测试了你的代码。我认为你的矩形_previousBounds第二次没有被绘制。