Я пытаюсь поймать нажатие клавиш 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
лайк Рэймонд Чен указал)?
Задача ещё не решена.