C#Winフォームカスタムコントロール--TextBox

効果:
 
説明:
プレースホルダプロパティの同様のhtmlタグ入力タグ、コントロールは、テキストボックスを継承し、メッセージ処理機能WndProcメソッドを書き換え、情報_txtPlaceHolder記述プロンプトフィールドを持っているメッセージは、窓の外に送信された場合、コントロールを描画し、ここで注意して描くようになりましたthis.InvalidateでTxtPlaceHolder設定方法は、()であり、これは、コントロールが描画されている場合、このコードは、フォームにこのコントロールをドラッグし、描画を再描画し、ならなくなり、コントロールが異常を報告する障害です。
例外:
理由:
私の実験の後、私は限り_txtPlaceHolderとしてこのフィールドが割り当てられているnull値が初期の後に除去されていないことがわかった「this.Invalidate();」という表現は、プログラムが実行することができます。その理由は、 _txtPlaceHolder.Length> 0
コード:
public sealed class MyCustomTextBox:TextBox
    {
        private const int WM_PAINT = 0x000F;
        private string _txtPlaceHolder="";

        [Category("自定义属性"), Description("文本框里的提示文字"), DefaultValue("请在此输入"), Browsable(true)]
        public string TxtPlaceHolder
        {
            get { return _txtPlaceHolder; }
            set {
                if (value == null) throw new ArgumentNullException("value");

                _txtPlaceHolder = value;
                this.Invalidate();
            }
        }
        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);
            if (m.Msg == WM_PAINT && !this.Focused && (this.TextLength == 0) && (_txtPlaceHolder.Length > 0))
            {
                TextFormatFlags tff = (TextFormatFlags.EndEllipsis |
                    TextFormatFlags.NoPrefix |
                    TextFormatFlags.Left |
                    TextFormatFlags.Top | TextFormatFlags.NoPadding);

                using (Graphics g = this.CreateGraphics())
                {

                    Rectangle rect = this.ClientRectangle;

                    rect.Offset(4, 1);

                    TextRenderer.DrawText(g, _txtPlaceHolder, this.Font, rect, SystemColors.GrayText, tff);
                }
            }
        }
    }

  


 
 

おすすめ

転載: www.cnblogs.com/HelloQLQ/p/11285766.html