none
我把TextBox的Enabled為false時的字體顏色改變了, 但顯示卻怪怪的? RRS feed

  • 問題

  • 我有個需求是希望TextBox的Enabled值為false時
    字體是藍色的 (系統會自動改成灰色)

    我自己找了如下的方法
    重寫一個TextBox

        public partial class cTextBox : TextBox
        {
            public cTextBox()
            {
                this.SetStyle(ControlStyles.UserPaint, true);
                InitializeComponent();
            }
    
            protected override void OnPaint(PaintEventArgs e)
            {
                SolidBrush drawBrush = new SolidBrush(ForeColor);
                e.Graphics.DrawString(Text, Font, drawBrush, 0f, 0f);
            }
        }


    當Enabled為false時, 顯示非常符合我的需求 (上面的TextBox是系統預設false時的顏色)



    當Enabled為true時, 進入下方TextBox的編輯區, 顯示就變得很奇怪了



    請問我該怎麼改寫這段程式呢?

    2009年11月6日 上午 10:22

解答

  • HI,

    您可以參考以下的例子:
    WaterMark TextBox For Desktop Applications Using C#, .NET 3.5 and VS2008(http://www.codeproject.com/KB/miscctrl/WaterMark.aspx)

    再將OnPaint方法改成這樣就可以達到您要的功能:

    protected override void OnPaint(PaintEventArgs args)
            {
                if (!Enabled)
                {
                    // Use the same font that was defined in base class
                    System.Drawing.Font drawFont = new System.Drawing.Font(Font.FontFamily, Font.Size, Font.Style, Font.Unit);
                    //Create new brush with gray color or
                    SolidBrush drawBrush = new SolidBrush(WaterMarkColor);//use Water mark color
                    //Draw Text or WaterMark
                    args.Graphics.DrawString((waterMarkTextEnabled ? WaterMarkText : Text), drawFont, drawBrush, new PointF(0.0F, 0.0F));
                }
                base.OnPaint(args);
            }
    • 已標示為解答 Lolota Lee 2009年11月13日 上午 07:17
    2009年11月6日 下午 01:24

所有回覆

  • HI,

    您可以參考以下的例子:
    WaterMark TextBox For Desktop Applications Using C#, .NET 3.5 and VS2008(http://www.codeproject.com/KB/miscctrl/WaterMark.aspx)

    再將OnPaint方法改成這樣就可以達到您要的功能:

    protected override void OnPaint(PaintEventArgs args)
            {
                if (!Enabled)
                {
                    // Use the same font that was defined in base class
                    System.Drawing.Font drawFont = new System.Drawing.Font(Font.FontFamily, Font.Size, Font.Style, Font.Unit);
                    //Create new brush with gray color or
                    SolidBrush drawBrush = new SolidBrush(WaterMarkColor);//use Water mark color
                    //Draw Text or WaterMark
                    args.Graphics.DrawString((waterMarkTextEnabled ? WaterMarkText : Text), drawFont, drawBrush, new PointF(0.0F, 0.0F));
                }
                base.OnPaint(args);
            }
    • 已標示為解答 Lolota Lee 2009年11月13日 上午 07:17
    2009年11月6日 下午 01:24
  • 謝謝提供範例
    我自己成功試出來了

    重點在:
    平時的時候要設為:this.SetStyle(ControlStyles.UserPaint, false);
    Disable時才要設為:this.SetStyle(ControlStyles.UserPaint, true);

    程式改寫後如下:
    public partial class cTextBox : TextBox
    {
        public cTextBox()
        {
            InitializeComponent();
        }
    
        protected override void OnEnabledChanged(EventArgs e)
        {
            if (Enabled)
            {
                this.SetStyle(ControlStyles.UserPaint, false);
                this.Font = new System.Drawing.Font(Font.FontFamily, Font.Size, Font.Style, Font.Unit);
    } else { this.SetStyle(ControlStyles.UserPaint, true); } base.OnEnabledChanged(e); } protected override void OnPaint(PaintEventArgs args) {
    base.OnPaint(args); args.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), new PointF(0.0F, 0.0F)); } }
    • 已編輯 sam319 2009年11月10日 上午 07:28
    2009年11月10日 上午 05:12
  • 請問一下
    如何在設計模式下更改Enabled屬性時
    就可以在預覽窗看到效果阿?

    我在OnEnabledChanged的事件中呼叫了Invalidate()
    但似乎沒有作用...
    2009年11月11日 上午 04:33