その1 Ctrl+Aの検出

名前いれたりとかに使用できるエディットコントロール
しかし初期のままでは何かと使いにくいのでこれから改良していきます(゜ω゜*)
基本的にリソースは使いません。


まずCtrl+Aで「全て選択」ができるようにします。
Ctrl+Aを入力すると

  1. WM_KEYDOWN(Ctrl)
  2. WM_KEYDOWN(A)
  3. WM_CHAR(...)

ときます。
3番目の...に何がくるかなんですが、TranslateMessage()*1の処理で「アルファベットの位置+1」がきます。つまりこの場合は、
'A'-'A'+1 で1がきます。
(試しにメモ帳でCtrl+Iを入力してみると、'I'-'A'+1 = 9となってTab(0x09)が挿入されます。)


これではCtrl+Aでキンキンと音が出てしまいますし、Ctrl+Iの処理の度にTabが挿入されても困ります。
なのでreturn 0としてエディットコントロールにメッセージ処理させないようにします。*2


そしてWM_KEYDOWNのwParamが'A'のときにCtrlが押されていれば「全て選択」するコードを追加します。


switch(msg) {
case WM_KEYDOWN:
    if (wParam=='A' && Key(Ctrl)) {
        int nSize = ::SendMessage(hEdit, WM_GETTEXTLENGTH, 0, 0) + 1;    // NULL文字分+1

        // メモ帳(上から下へ)
        ::SendMessage(hEdit, EM_SETSEL, 0, nSize);
        // VC++風(下から上へ)
        //::SendMessage(hEdit, EM_SETSEL, nSize, 0);
    

        // キャレットが見える位置へスクロール
        ::SendMessage(hEdit, EM_SCROLLCARET, 0, 0);
    }
}


(つづく)

*1:他のメッセージいらないなら使わなくてもoKです

*2:Tab入力も無効になるので、WM_KEYDOWNでTabキーを受けてTabコードを自分で追加します。(Ctrl+Mの場合は改行コード)