TextBoxの背景に文字を入れる

過去のブログのアーカイブ
この記事は前身のブログのアーカイブを引き継いだものです. 画像が正しく表示できないなど,コンテンツの表示に問題がある恐れがあります.

テキストボックスに文字を入れてない時に背景にうっすら表示させる仕組みが実はVistaからあるのです。
その仕様の紹介とサンプルソースのご紹介

仕様

SendMessageにてハンドルとメッセージ5377を送信することでできます。
パラメータはこのような感じ

wParam 1の場合、フォーカスがあっても文字が入力されていなければバーナを表示する
lParam バーナテキスト

ソースコード

[DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam);
bool showFocus = false;
string bunnerText = "バーナテキスト";
SendMessage(this.Handle, 5377, new IntPtr(showFocus ? 1 : 0), bunnerText);

表示はこのような感じです。
banner-textbox
地味な機能ですがユーザーアクティビティがアップしたりスタイルがよくなったりといいことが多いので多様するのもいいかもしれません。
使うとしたらこんな感じかな
btext-form

ソースコード全文

めんどくさい人用においておきます。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WinAPI.Const;
namespace WinAPI.Control
{
    [ToolboxBitmap(typeof(TextBox))]
    public class TextBox : System.Windows.Forms.TextBox
    {
        private string _cueBannerText = string.Empty;
        private bool _showCueFocused;
        public TextBox()
        {
        }
        [Category("Appearance"), DefaultValue("")]
        public string CueBannerText
        {
            get
            {
                return this._cueBannerText;
            }
            set
            {
                this._cueBannerText = value;
                this.SetCueText(this.ShowCueFocused);
            }
        }
        [Browsable(false)]
        public new bool Multiline
        {
            get
            {
                return base.Multiline;
            }
            set
            {
                base.Multiline = false;
            }
        }
        [DefaultValue(false), Category("Appearance")]
        public bool ShowCueFocused
        {
            get
            {
                return this._showCueFocused;
            }
            set
            {
                this._showCueFocused = value;
                this.SetCueText(value);
            }
        }
        private void SetCueText(bool showFocus)
        {
            NativeMethod.SendMessage(base.Handle, 5377, new IntPtr(showFocus ? 1 : 0), this._cueBannerText);
        }
    }
    public partial class NativeMethod
    {
        [DllImport("user32.dll", CharSet = CharSet.Unicode)]
        public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam);
    }
}