Настроить процедуру подкласса, чтобы ее можно было использовать как в окне, так и в диалоговом окне.

Я пытаюсь поймать нажатие клавиш ENTER и ESC в однострочном редактировании.

Когда пользователь нажимает ENTER или ESC, я хочу убрать фокус клавиатуры из режима редактирования и установить его в качестве списка управления. Элемент управления Listview является родственным элементом элемента управления Edit.

Моя цель состоит в том, чтобы написать одну процедуру подкласса, которая может использоваться для создания подклассов элементов управления редактированием как в главном окне, так и в диалоговом окне.

я нашел эта статья MSDN что я нашел полезным из-за его второго решения. Ниже моя адаптация кода.

// 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 лайк Рэймонд Чен указал)?

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector