2013-10-31 25 views
0

很難explane我的問題的話,那麼我將文字和圖像:)的C#Windows窗體的上下文菜單控制不消失,完全

我有上下文菜單控制,我贏形式的應用程序(微軟的Visual嘗試工作室項目)。 它不會完全消失,它的一部分保留在我的面板控件上,它是自定義面板類(帶有bordercolor屬性)。僅在Windows XP中出現的問題,無法在Windows 7

enter image description here

enter image description here 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錯誤?

回答

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

你只畫在面板的頂部線條,僅此而已。我需要與邊境 – vinsa

+0

面板,然後使用新的Rectangle(0,0,this.ClientSize .Width-2,this.ClientSize.Height-2);請不要猶豫,在這裏使用答案來學習如何編寫正確的代碼,我們真的不想爲你做這項工作:)希望你明白爲什麼使用ClipRectangle是錯的,那就是重點。 –

+0

是的,問題是ClipRectangle,所以我現在使用'new Rectangle(0,0,this.ClientSize.Width,this.ClientSize.Height)'代替它,它的工作非常好,謝謝。 – vinsa