gamemaster.jp

TRPGについていろいろ書いたり。ツールとか置いてあったり。

『1月, 2013』の記事

ゲーム性……。 —

http://togetter.com/li/447128
よく使っちゃうけども。カタカナ語に「性」つけるとあっという間に定義がgdgdになるよね……。

http://togetter.com/li/447128 よく使っちゃうけども。カタカナ語に「性」つけるとあっという間に定義がgdgdになるよね……。

正規表現で入力制御したり、ウォーターマーク機能のあるテキストボックス@C# —

入力検証時にバルーンを出す方法とか、ウォーターマークを出す方法とかをちょっと調べたりしたんでメモとして。
とりあえず動けばいいって感じなんでコードは適当。

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;
            }
        }

    }
}

入力検証時にバルーンを出す方法とか、ウォーターマークを出す方法とかをちょっと調べたりしたんでメモとして。 とりあえず動けばいいって感じなんでコードは適当。 using System; using System.Compo […]