0

私の問題を言葉で説明するのは難しいので、言葉と画像で試してみます:)

Win フォーム アプリ (ms ビジュアル スタジオ プロジェクト) にコンテキスト メニュー コントロールがあります。それは完全に消えるわけではなく、その一部がパネル コントロールの上に残ります。これはカスタム パネル クラスです (bordercolor プロパティを使用)。この問題は 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 に答える