効果:
説明:
プレースホルダプロパティの同様の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); } } } }