c# Windowsフォームで、ウォーターマーク(透かし文字)付きのTextBoxを作成します。
WPFのサンプルコードはMicrosoftの公式にあがっていますね。
今回はWindowsフォーム版です。
呼び方は色々あるようですが、htmlでいうplaceholderでしょうか。
では実際の作り方を。
まず、TextBoxを継承したカスタムコントロールを作成します。
using System;
using System.Drawing;
using System.ComponentModel;
using System.Windows.Forms;
namespace WatermarkSample
{
/// <summary>
/// ウォーターマークを表示するテキストボックス
/// </summary>
public partial class WatermarkTextbox : TextBox
{
/// <summary>ウォーターマーク内部値</summary>
private string _watermarkText = string.Empty;
/// <summary>
/// コンストラクタ
/// </summary>
public WatermarkTextbox()
{
InitializeComponent();
}
/// <summary>ウォーターマーク</summary>
public string WatermarkText {
get
{
return _watermarkText;
}
set
{
_watermarkText = value;
this.Invalidate();
}
}
/// <summary>
/// ウォーターマーク設定ありの場合に描画します
/// </summary>
/// <param name="m"></param>
protected override void WndProc(ref Message m)
{
const int WM_PAINT = 0x000F;
const int WM_LBUTTONDOWN = 0x0201;
base.WndProc(ref m);
if ((m.Msg == WM_PAINT || m.Msg == WM_LBUTTONDOWN) &&
this.Enabled &&
string.IsNullOrEmpty(this.Text) &&
!string.IsNullOrEmpty(WatermarkText)
)
{
using (Graphics g = Graphics.FromHwnd(this.Handle))
{
Rectangle rect = this.ClientRectangle;
rect.Offset(1, 1);
TextRenderer.DrawText(g,
WatermarkText,
this.Font,
rect,
Color.LightGray,
TextFormatFlags.Top | TextFormatFlags.Left);
}
}
}
}
}
やっていることは簡単で、
TextBoxの入力がない場合に、WatermarkTextプロパティの値を描画する、という感じです。
上記のクラスを作成後、ビルドします。
あとはデザイナ上でツールボックスから選択できます。
透かしにしたい文字を、WatermarkTextプロパティに設定すれば反映されます。
おしゅーまい。