0

很难用文字来解释我的问题,所以我会尝试用文字和图像:)

我的 win 表单应用程序(ms visual studio 项目)中有上下文菜单控件。它并没有完全消失,它的一部分停留在我的面板控件上,它是自定义面板类(具有边框颜色属性)。该问题仅出现在 Windows XP 上,而不出现在 Windows 7 上。

在此处输入图像描述

在此处输入图像描述 2.源代码:

public class MyPanel : Panel 
{
    private System.Drawing.Color colorBorder = System.Drawing.Color.Transparent;

    public MyPanel()
        : base()
    {
        this.SetStyle(ControlStyles.UserPaint, true);
        this.BorderStyle = BorderStyle.None;
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        e.Graphics.DrawRectangle(new System.Drawing.Pen(
            new System.Drawing.SolidBrush(colorBorder), 2), e.ClipRectangle);
    }

    protected override void OnResize(EventArgs e)
    {
        Invalidate();  
    }

    public System.Drawing.Color BorderColor
    {
        get
        {
            return colorBorder;
        }
        set
        {
            colorBorder = value;
        }
    }
}

如何解决这个问题?当上下文菜单关闭事件发生时,我可以为面板添加 Invalidate() (以重绘它),但我想知道为什么会发生这个问题,是一些 .NET Framework 错误吗?

4

1 回答 1

1
    e.Graphics.DrawRectangle(new System.Drawing.Pen(
        new System.Drawing.SolidBrush(colorBorder), 2), e.ClipRectangle);

您的代码实际上要求 Graphics 类绘制该矩形。您使用了 ClipRectangle 属性,它表示围绕需要重新绘制的窗口部分的边界矩形。这只是面板和上下文菜单之间的交集。您绘制的是围绕整个面板的矩形。或者只是将面板与工具条分开的一条线,尚不清楚。猜测这条线是期望的结果:

protected override void OnPaint(PaintEventArgs e) {
    base.OnPaint(e);
    using (var pen = new Pen(colorBorder, 2)) {
        e.Graphics.DrawLine(pen, Point.Empty, new Point(this.ClientSize.Width, 0));
    }
}
于 2013-10-31T15:46:09.167 回答