2013-11-28 57 views
0

我正在處理一些自定義控件,我正在尋找一些反饋。其中一個控件在設計時看起來與標準TextBox類似,當它被拖放到設計圖面上時,控件的名稱將寫入文本區域。這一切都很好,但我覺得有一個更簡單的方法來完成我所做的。我有以下代碼:現在DrawString()問題和調整自定義控件的大小

public override void Draw(Graphics graphics) 
{ 
     graphics.FillRectangle(new SolidBrush(BackColor), ClientRectangle); 
     graphics.DrawString(Text, Font, new SolidBrush(ForeColor), TextRectangle, format); 
     DrawControl(graphics); 
} 

protected void DrawControl(Graphics graphics) 
{ 
     CotrolPaint.DrawBorder3D(graphics, ClientRectangle, Border3DStyle.Etched); 
} 

protected Rectangle TextRectangle 
{ 
     get 
     { 

      return new Rectangle(ClientRectangle.Left + 2, 
             ClientRectangle.Top + 2, 
             ClientRectangle.Width - 5, 
             ClientRectangle.Height - 5); 
     } 
} 

回顧過去的代碼,TextRectangle也許應該是一個只讀的常量,但我離題。代碼非常簡單,我掛上的是我的TextRectangle屬性。我使用這個的原因是ClientRectangle而不是ClientRectangle,因爲在矩形內寫入的文本會被幾個像素截斷。因此,我有一個稍微偏移一點的小矩形。這有效,但感覺就像是「黑客」。我不得不相信,比我在這裏展示的更好的方式來做到這一點。

我的下一個問題很難解釋,所以我提供了幾個圖像。如果我從工具箱到設計界面上拖我的自定義控件,它看起來與此類似:

Design 1

但是如果我手動調整控制,選擇矩形保留其原來的大小:

Design 2

我在如何解決這個問題上有點不知所措。任何問題的任何幫助將不勝感激!

回答

0

你對第一個問題所做的並不是真正的某種破解,事實上許多默認控件都是用一些硬編碼填充(通常使用的是12 ...)。通常情況下,文本邊界的最大矩形是ClientRectangle,如果你想要一些填充,當然你可以調整它(就像你做的那樣)。

對於第二個問題,這是因爲在更改大小後沒有任何代碼使控件失效,甚至在更改文本,字體和前景顏色時必須無效。嘗試添加以下代碼到您的代碼,它應該工作:

protected override void OnSizeChanged(EventArgs e){ 
    base.OnSizeChanged(e); 
    Invalidate(); 
} 
protected override void OnTextChanged(EventArgs e){ 
    base.OnTextChanged(e); 
    Invalidate(); 
} 
protected override void OnFontChanged(EventArgs e){ 
    base.OnFontChanged(e); 
    Invalidate(); 
} 
protected override void OnForeColorChanged(EventArgs e){ 
    base.OnForeColorChanged(e); 
    Invalidate(); 
} 
+0

King King:謝謝您的反饋!至於第二部分,您提供的選擇框不重新繪製的原因是正確的,但您的修復不是。隨着控件在設計圖面上調整大小,OnSizeChanged事件會不斷調用,但在調整大小後,選擇框仍然是原始大小。 我知道問題在於控件未被正確無效,因爲如果我調整控件的大小然後手動更改屬性,選擇控件將被正確重畫。我的想法是鉤住ResizeEnd事件,但控制不公開這一點。 = \ – dparsons

+0

@abszero如果是這樣,我認爲你的問題確實非常非常奇怪。我有一些自定義控件的經驗,在任何情況下,重寫'OnSizeChanged'就足夠了。 –