2012-02-12 6 views
4

それは次のようにVisual Studioでテキストボックスを作成することが可能です:カスタムTextBoxコントロール

+1

あなたがテキストボックスにあなたのケースでウォーターマーク(ユーザー名)を追加することができるのWinFormsを使用している場合... –

+0

テキストが消えませんSOの検索ボックスのようなボックスをクリックすると、 –

+0

は、私はそれがあなたのために働いてくれてうれしい:) –

答えて

3

3つのTextBoxイベントを処理する必要があります。デザイナでTextBoxのテキストを「username」に設定し、Font ItalicsにTextBox BackColorをLightYellowに設定し、残りをイベントハンドラで処理します。

 private void textBox1_TextChanged(object sender, EventArgs e) 
    { 
     if (textBox1.Text == "") 
      ChangeTextBoxtoWatermark(); 
    } 

    private void textBox1_MouseEnter(object sender, EventArgs e) 
    { 
     if (textBox1.Text == "username") 
     { 
      textBox1.Text = ""; 
      textBox1.Font = new Font(this.Font, FontStyle.Regular); 
      textBox1.BackColor = Color.White; 
     } 
    } 

    private void textBox1_MouseLeave(object sender, EventArgs e) 
    { 
     if (textBox1.Text == "") 
      ChangeTextBoxtoWatermark(); 
    } 

    private void ChangeTextBoxtoWatermark() 
    { 
     textBox1.Font = new Font(this.Font, FontStyle.Italic); 
     textBox1.BackColor = Color.LightYellow; 
     textBox1.Text = "username"; 
    } 

は、私はそれをチェックして、それが動作する罰金:)

+1

あなたはTextBoxToOriginalのようなコードを屈折することができます() –

11

。よりよい解決策は、テキストボックスのPaintイベントを使用して文字列を描画することです。ここで

はコードです:

class CueTextBox : TextBox 
{ 
    public event EventHandler CueTextChanged; 
    private string _cueText; 

    public string CueText 
    { 
     get { return _cueText; } 
     set 
     { 
      value = value ?? string.Empty; 
      if (value != _cueText) 
      { 
       _cueText = value; 
       OnCueTextChanged(EventArgs.Empty); 
      } 
     } 
    } 

    public CueTextBox() 
     : base() 
    { 
     _cueText = string.Empty; 
    } 

    protected virtual void OnCueTextChanged(EventArgs e) 
    { 
     this.Invalidate(true); 
     if (this.CueTextChanged != null) 
      this.CueTextChanged(this, e); 
    } 

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

     if (string.IsNullOrEmpty(this.Text.Trim()) && !string.IsNullOrEmpty(this.CueText) && !this.Focused) 
     { 
      Point startingPoint = new Point(0, 0); 
      StringFormat format = new StringFormat(); 
      Font font = new Font(this.Font.FontFamily.Name, this.Font.Size, FontStyle.Italic); 
      if (this.RightToLeft == RightToLeft.Yes) 
      { 
       format.LineAlignment = StringAlignment.Far; 
       format.FormatFlags = StringFormatFlags.DirectionRightToLeft; 
      } 
      e.Graphics.DrawString(CueText, font, Brushes.Gray, this.ClientRectangle, format); 
     } 
    } 

    const int WM_PAINT = 0x000F; 
    protected override void WndProc(ref Message m) 
    { 
     base.WndProc(ref m); 
     if (m.Msg == WM_PAINT) 
     { 
      this.OnPaint(new PaintEventArgs(Graphics.FromHwnd(m.HWnd), this.ClientRectangle)); 
     } 
    } 
} 

は今、必要なのはセットしたいとあなたが行われている初期値に「CueText」プロパティです!

+1

良いヒントが、初心者のために少し複雑な:) –

+0

あなたが予期しない結果につながる可能性があるテキストボックスの「テキスト」プロパティを変更していないこの方法です。私の解決策では、テキストのみテキストボックス領域の上に塗装され、あなたは何の心配もせずにTextプロパティを使用することができます – Nissim

+1

私は個人的にあなたのソリューションを好き:) –

関連する問題