とりあえず動けばいいって感じなんでコードは適当。
using System; using System.ComponentModel; using System.Drawing.Design; using System.Runtime.InteropServices; using System.Text.RegularExpressions; using System.Windows.Forms; namespace example { ////// 正規表現で入力制御したり、ウォーターマークを表示できるテキストボックス /// public class CustomTextBox : TextBox { private const int ECM_FIRST = 0x1500; private const int EM_SETCUEBANNER = ECM_FIRST + 1; private const int EM_SHOWBALLOONTIP = ECM_FIRST + 3; private const int EM_HIDEBALLOONTIP = ECM_FIRST + 4; private const int Win32False = 0; private const int Win32True = 1; [DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern int SendMessage(IntPtr hWnd, int msg, int wParam, string lParam); [DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern bool SendMessage(IntPtr hWnd, int Msg, int wParam, IntPtr lParam); [DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern bool SendMessage(IntPtr hWnd, int Msg, int wParam, ref EDITBALLOONTIP lParam); [StructLayout(LayoutKind.Sequential)] private struct EDITBALLOONTIP { public int cbStruct; [MarshalAs(UnmanagedType.LPWStr)] public string pszTitle; [MarshalAs(UnmanagedType.LPWStr)] public string pszText; public int ttiIcon; } private enum BalloonIcon { ShowNone = ToolTipIcon.None, ShowInformation = ToolTipIcon.Info, ShowWarning = ToolTipIcon.Warning, ShowError = ToolTipIcon.Error } // 概要: // CustomTextBox クラスの新しいインスタンスを初期化します。 public CustomTextBox() { } ////// 入力可能な文字列を正規表現で指定 /// [RefreshProperties(RefreshProperties.Repaint)] [Category("動作")] [DefaultValue(".")] [Description("入力可能な文字を正規表現で指定します。")] [Localizable(true)] public string ValidateCharRegex { get; set; } ////// 入力可能な文字列の説明を指定 /// [RefreshProperties(RefreshProperties.Repaint)] [Category("動作")] [DefaultValue("入力できる文字が制限されています。")] [Description("エラーメッセージに利用される、入力可能な文字の説明を指定します。")] [Localizable(true)] public string ValidateErrorMessage { get; set; } ////// ウォーターマークとして表示する文字列を指定 /// [Category("表示")] [DefaultValue("")] [Description("テキストが空の場合に表示する文字列を設定または取得します。")] public string Watermark { get; set; } ////// ウォーターマークを設定する(Windows Vista以降のみ) /// private void SetWatermark() { SendMessage(this.Handle, EM_SETCUEBANNER, Win32False, this.Watermark); } ////// ハンドルが生成された直後のイベント /// /// protected override void OnHandleCreated(EventArgs e) { base.OnHandleCreated(e); // ウォーターマークを設定するためにはハンドルが必要。 this.SetWatermark(); } ////// キーが押された場合のイベント /// /// protected override void OnKeyPress(KeyPressEventArgs e) { // 指定された正規表現に一致しない場合、入力をキャンセルする if (!Regex.IsMatch(e.KeyChar.ToString(), this.ValidateCharRegex) && e.KeyChar != '\b') { base.OnKeyPress(e); EDITBALLOONTIP balloontip = new EDITBALLOONTIP(); balloontip.cbStruct = Marshal.SizeOf(balloontip); balloontip.ttiIcon = (int)BalloonIcon.ShowError; balloontip.pszTitle = "入力できない文字です"; balloontip.pszText = ValidateErrorMessage; SendMessage(this.Handle, EM_SHOWBALLOONTIP, Win32False, ref balloontip); e.Handled = true; } } } }
Categorised as:雑記
コメントを残す