1

単一行編集コントロールで 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

4

0 に答える 0