2009-08-03 57 views
3

我使用下面的代碼來獲得一個TextBox未繪製其邊界:如何將字體保留在繼承的TextBox中?

public partial class CustomTextBox : TextBox 
{ 
    public CustomTextBox() 
    { 
     InitializeComponent(); 
     SetStyle(ControlStyles.UserPaint, true); 
    } 

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

     int borderWidth = 1; 

     ControlPaint.DrawBorder(e.Graphics, e.ClipRectangle, 
      Color.Transparent, borderWidth, ButtonBorderStyle.Solid, 
      Color.Transparent, borderWidth, ButtonBorderStyle.Solid, 
      Color.Transparent, borderWidth, ButtonBorderStyle.Solid, 
      Color.Transparent, borderWidth, ButtonBorderStyle.Solid); 
    } 
} 

我似乎錯過OnPaint()方法的內在的東西,因爲我的字體不是默認字體的文本框了(也許我必須重寫另一個事件)。

當檢查CustomTextBox.Font屬性它讓我看到默認的「微軟SANSSERIF在8,25」,但鍵入文本到我的文字方塊字體肯定看起來更大和大膽。

希望你能幫幫我!

問候,

INNO

[編輯]

我應該指出,如果我不重寫的OnPaint我CustomTextBox的字體是正確的。只有當重寫OnPaint時,我的字體不正確(當輸入文字時字體更大並且看起來像是粗體)。 所以我覺得我必須做些什麼來正確初始化字體的OnPaint內(但ATM我不知道如何做到這一點)。

回答

2

有兩種選擇讓你看... 在我的基類中,我強制使用只讀字體定義...與其他控件類似,所以其他類的開發人員無法更改它--- PERIOD。

[ReadOnly(true)] 
public override Font Font 
{ 
    get 
    { 
     return new Font("Courier New", 12F, FontStyle.Regular, GraphicsUnit.Point); 
    } 
} 

第二個選項,我沒有實際使用的是在窗體的序列化過程中。我無法相信,也不記得我在這個論壇中的其他地方找到了什麼,但也可能有幫助。 Apparenty,通過hidding序列化的知名度,它不會強迫每個人控件的屬性(在這種情況下,適用於您的字體)[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

HTH

+1

將這兩種方法添加到我的CustomTextBox類中,但沒有成功。不管怎麼說,還是要謝謝你。 – Inno 2009-08-03 13:17:30

2

如果不明確地設置文本框的字體,它從它的父代和祖先獲得它的字體,所以如果TextBox在Panel上,它從該Panel或從父Form獲取它的字體。

+0

父母有相同的字體「微軟SANSSERIF 8,25」,但打字時,我不認爲它的這個字體。 – Inno 2009-08-03 13:18:59

0

上一個文本框使用SetStyle將永遠陷入困境的畫,根據this answer

但是......沒有任何理由,爲什麼你不能簡單地設置它的BorderStyleNone

如果你需要,你甚至可以修改BorderStyle,以便它的默認值是None,這樣的:

using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 

namespace MyControls 
{ 
    // Apply ToolboxBitmap attribute here 
    public class CustomTextBox : TextBox 
    { 
    public CustomTextBox() 
    { 
     BorderStyle = BorderStyle.None; 
    } 

    [DefaultValue(typeof(System.Windows.Forms.BorderStyle),"None")] 
    public new BorderStyle BorderStyle 
    { 
     get { return base.BorderStyle; } 
     set { base.BorderStyle = value; } 
    } 
    } 
} 
2

不要調用setStyle如果尚未創建的文本框把手,它永遠不會變成那個'大號'字體:

if (IsHandleCreated) 
{ 
    SetStyle(ControlStyles.UserPaint, true); 
} 
+1

Da real mvp就在這裏 – Julien 2015-09-01 13:00:44