[C#] FormのTextBoxでダブルクリック時に区切り記号まで選択させる方法

Windows FormアプリケーションでTextBoxの内容をダブルクリックしたときに、区切り記号までの選択にする方法を紹介します。


プログラミング言語に関する記事は久しぶりですね。

C#でTextBoxに関するテクニックを紹介します。

TextBoxでMulti Lineモードで文章やソースを編集するアプリケーションを作ったとき、よくできたテキストエディターのように、ダブルクリックしたときにいい感じで選択範囲を指定したいのですが、デフォルトのダブルクリック時の選択範囲はあまりいい感じではありません。

そこで、いい感じの選択範囲にするために、区切り記号で囲まれた部分はその内部までの選択範囲になるような処理を追加します。.NETのダブルクリックイベントでは上手いような挙動にならないので、TextBoxを継承してWndProcをオーバーライドしてメッセージを処理するようにします。

using System.Windows.Forms;
namespace TestTextBoxSelection
{
    class TextBoxEx : TextBox
    {
        private const int WM_LBUTTONDBLCLK = 0x0203;

        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_LBUTTONDBLCLK)
            {
                int start = this.SelectionStart;
                if (start < 1) start = 1;
                int left = 0;
                for (int i = start - 1; i >= 0; i--)
                {
                    if (IsDelimiter(this.Text[i]))
                    {
                        left = i;
                        break;
                    }
                }
                int right = 0;
                for (int i = start; i < this.Text.Length; i++)
                {
                    if (IsDelimiter(this.Text[i]))
                    {
                        right = i;
                        break;
                    }
                }
                if (right == -1) right = this.Text.Length;
                this.SelectionStart = left + 1;
                this.SelectionLength = right - left - 1;
                return;
            }

            base.WndProc(ref m);
        }

        private bool IsDelimiter(char c)
        {
            return c == '\'' || c == '\"' || c == ' ' || c == ' ' || c == ',' || c == '.' || c == ':' || c == ';' || c == '(' || c == ')' || c == '(' || c == ')' || c == '\r' || c == '\n';
        }
    }
}

あとは使っているTextBoxをTextBoxExに置き換えるだけです。

Follow me!

Feedlyで新着記事をチェックしよう!

Feedlyでフォローしておけば、新着記事をチェックすることができます。ぜひ、この機会にFeedlyに追加しておきましょう。