c#

【.net】[c#]Windowsフォームでウォーターマーク(透かし文字)付きのTextBoxを作成する

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プロパティに設定すれば反映されます。

おしゅーまい。


 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です