C#Winform Panel清除/完全更新---用于鼠标的多项选择

问题描述

我想在面板中选择一些结构(多边形和矩形)。我使用了新的ExtendedPanel类,以实现鼠标面板的不透明性。
panel1用于结构,extendedPanel1用于鼠标的选定区域。 (SetSelectionRect()就是选择区域的集合)

在下图中,红色是我在panel1上绘制的图形,绿色是由鼠标选择的矩形。实际上,它应该显示一个绿色矩形,这是鼠标选择结束时的矩形,但是现在有很多。这表明extendetPanel1中的透明度设置在extendedPanel1.Invalidate();之后起作用,但是绘制的历史矩形不会消失。

您能告诉我,如何在面板中编写鼠标选择代码?

我实际上想实现一些多边形并进行编辑。我在panel1中绘制了一些多边形(矩形),现在我想使用鼠标来选择一些部分并进行一些更改(例如删除一些多边形)。
我对此的想法是:在panel1上绘制多边形,panel2用鼠标显示选择,但是panel2的底部是透明的。

然后,根据坐标计算等,判断panel1中的几何图形是否在panel2中选择的区域中。如果是,那么我将其删除。我不知道我的想法是否合理。 如果您能提供合适的解决方案,我非常感谢。

Sample image

extendetpanel代码:

public class ExtendedPanel : Panel
{
    private const int WS_EX_TRANSPARENT = 0x20;
    public ExtendedPanel()
    {
        SetStyle(ControlStyles.Opaque,true);
    }

    private int opacity = 0;
    [DefaultValue(0)]
    public int Opacity
    {
        get
        {
            return this.opacity;
        }
        set
        {
            if (value < 0 || value > 100)
                throw new ArgumentException("value must be between 0 and 100");
            this.opacity = value;
        }
    }
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle = cp.ExStyle | WS_EX_TRANSPARENT;
            return cp;
        }
    }
    protected override void OnPaint(PaintEventArgs e)
    {
        using (var brush = new SolidBrush(Color.FromArgb(this.opacity * 255 / 100,this.BackColor)))
        {
            e.Graphics.FillRectangle(brush,this.ClientRectangle);
        }
        base.OnPaint(e);
    }
}

绘画和事件代码:

        private void extendedPanel1_Paint(object sender,PaintEventArgs e)
    {

        base.OnPaint(e);           

        extendedPanel1.Opacity = 0;
        if (mouseDown)
        {
            using (Pen pen = new Pen(Color.Green,1F))
            {
                pen.DashStyle = DashStyle.Dash;
                e.Graphics.DrawRectangle(pen,selection);
            }
        }
        
    }

    private void extendedPanel1_MouseDown(object sender,MouseEventArgs e)
    {
        selectionStart = extendedPanel1.PointToClient(MousePosition);
        mouseDown = true;
    }

    private void extendedPanel1_MouseUp(object sender,MouseEventArgs e)
    {
        mouseDown = false;
        SetSelectionRect();
        extendedPanel1.Invalidate();
    }

    private void extendedPanel1_MouseMove(object sender,MouseEventArgs e)
    {
        if (!mouseDown)
            return;
        selectionEnd = extendedPanel1.PointToClient(MousePosition);
        SetSelectionRect();
        extendedPanel1.Invalidate();
    }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...