2009-04-16 47 views
0

我寫利用下述(很簡單)控制在一個應用程序(註釋爲簡潔起見刪除):我在做什麼我的自定義「Horizo​​ntalRule」控件有問題?

public partial class HorizontalRule : Control 
{ 
    public HorizontalRule() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 

     var g = e.Graphics; 

     var rect = new Rectangle(
      this.ClientRectangle.Left, 
      this.ClientRectangle.Height/2 + 1, 
      this.ClientRectangle.Width, 
      1); 

     ControlPaint.DrawBorder3D(g, rect, Border3DStyle.Etched); 

     return; 
    } 
} 

免責聲明:我在畫我自己的控制是一個新手。

我選擇以這種方式繪製線條,基於recommendation in the Vista UX guidelines,這表明分隔符的高度爲1的蝕刻矩形。

當靜態時,這看起來很好,但我注意到,如果將此控件放置在窗口中並調整其大小(通過錨點,例如),我會重繪工件。我在我的整個客戶矩形的寬度上重繪我的邊框,但它就像沒有真正被繪製。在Horizo​​ntalRule的構造函數中啓用DoubleBuffered,或以其嵌入的形式啓用,似乎也沒有什麼區別。

我在做什麼錯?

更新:

%的建議,我打過電話base.OnPaint最後,而不是第一個。我不知道會發生什麼變化,也不會改變任何事情。

沒有畫出背景沒有用處。我仍然得到了僞像,但是我也沒有得到背景顏色,所以我看到了水平線下的任何圖像。

回答

1

我能砍不通過重寫onResize受到導致僞像的解決方案()無效整個控制。

0

我會在位圖上繪製該圖,然後繪製位圖而不用擔心每次都會繪製它。

+0

你是什麼意思?第一次顯示控件時,將邊框繪製到位圖上,然後在控件的寬度上拉伸該位圖? – 2009-04-16 17:21:52

+0

這可以工作,我指的是緩存它。 – 2009-04-16 18:28:04

1

不要打電話base.OnPaint,或者最後打電話給我(我現在不能回憶)。

此外,嘗試覆蓋背景塗色方法,所以它不會調用基地。然而

protected override void OnResize(EventArgs e) 
{ 
    base.OnResize(e); 

    this.Invalidate(); 
} 

我不知道這是「正確」的解決方案,:

+0

不繪製背景肯定會是一個開始 – 2009-04-16 17:50:09