単一行編集コントロールで ENTER および ESC キーの押下をキャッチしようとしています。
ユーザーが ENTER または ESC を押すと、編集コントロールからキーボード フォーカスを取り除き、リストビュー コントロールに設定します。Listview コントロールは、エディット コントロールの兄弟です。
私の目標は、メイン ウィンドウとダイアログ ボックスの両方でエディット コントロールをサブクラス化するために使用できる単一のサブクラス プロシージャを記述することです。
この MSDN の記事は、2 番目の解決策のために役立つことがわかりました。以下は、コードの私の適応です。
// subclass procedure for edit control
LRESULT CALLBACK InPlaceEditControl_SubclassProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam,
UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
switch (message)
{
case WM_GETDLGCODE:
return (DLGC_WANTALLKEYS | DefSubclassProc(hwnd, message, wParam, lParam));
case WM_CHAR:
//Process this message to avoid message beeps.
switch (wParam)
{
case VK_RETURN:
// change focus to listview
SetFocus(hwndListView);
return 0L;
case VK_ESCAPE:
// change focus to listview
SetFocus(hwndListView);
return 0L;
default:
return ::DefSubclassProc(hwnd, message, wParam, lParam);
}
break;
case WM_KEYDOWN:
switch (wParam)
{
case VK_RETURN:
// change focus to listview
SetFocus(hwndListView);
return 0L;
case VK_ESCAPE:
// change focus to listview
SetFocus(hwndListView);
return 0L;
default:
return ::DefSubclassProc(hwnd, message, wParam, lParam);
}
break;
case WM_NCDESTROY:
::RemoveWindowSubclass(hwnd, InPlaceEditControl_SubclassProc, uIdSubclass);
return DefSubclassProc(hwnd, message, wParam, lParam);
}
return ::DefSubclassProc(hwnd, message, wParam, lParam);
}
質問:
私の適応は正しいですか、それとも何かが欠けていますか (レイモンド・チェンが指摘したようSetFocus
に使用する必要があるのではなく)?WM_NEXTDLGCTL