その1 Ctrl+Aの検出
名前いれたりとかに使用できるエディットコントロール。
しかし初期のままでは何かと使いにくいのでこれから改良していきます(゜ω゜*)
基本的にリソースは使いません。
まずCtrl+Aで「全て選択」ができるようにします。
Ctrl+Aを入力すると
- WM_KEYDOWN(Ctrl)
- WM_KEYDOWN(A)
- 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);
}
}
(つづく)