C#Winform面板清除/完全更新---用于鼠标多选

C#Winform面板清除/完全更新---用于鼠标多选,c#,winforms,c#-4.0,panel,c#-3.0,C#,Winforms,C# 4.0,Panel,C# 3.0,我想在面板中选择一些结构(多边形和矩形)。我使用了新的ExtendedPanel类,用于鼠标面板的不透明度。 panel1用于结构,extendedPanel1用于鼠标的选定区域。(SetSelectionRect()ist选择区域的集合) 在下图中,红色是我在panel1上绘制的图形,绿色是鼠标选择的矩形。事实上,它应该显示一个绿色的矩形,这是鼠标选择结束时的矩形,但现在有很多。这表明extendedPanel1中的透明度设置在extendedPanel1.Invalidate()之后工作,但

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

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

您能告诉我,我应该如何编写面板中鼠标选择的代码

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

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

扩展面板代码:

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

大家好,欢迎来到SO
您能告诉我,我应该如何在面板中编写鼠标选择的代码吗?
,您有什么具体问题?您是否使用“+=”注册了事件?您确实应该避免调用
base.OnPaint(e)
在事件处理程序中,该调用属于
OnPaint()
覆盖。如果更改不透明度级别,则应使控件无效。不清楚
SetSelectionRect()
正在做什么(只设置
selection
?)Ext:您不需要
指向客户端(MousePosition)
MouseEventArgs
已经为您提供了位置
mouseDown
也不需要,您应该检查鼠标左键是否已按下。为此,您可能应该使用PictureBox,而不是面板(很长时间才能解释)。更多…不确定你想要什么。一个非持久性矩形?由于字数限制,我在答案区直接描述了它。
        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();
    }