我已经在 WM_CREATE 消息处理程序中的窗口中创建了多个控件,并且我希望允许使用 Tab 键将焦点通过一组控件从一个控件移到下一个控件。
控件创建是这样的:
case WM_CREATE:
{
CreateWindowA("button", "Refresh Listview",
BS_MULTILINE | WS_CHILD | WS_VISIBLE, 10, 10, 70, 50,
hwnd, (HMENU)IDC_REFRESHLW, g_hInst, NULL);
break;
}
当我按 Tab 键将焦点更改到窗口中的另一个控件时,它什么也不做。我必须以某种方式初始化它吗?
我注意到,如果我使用对话框,它已经自动允许使用 Tab 键,并且 Tab 键顺序是您在 .rc 文件中创建控件的顺序。
但我不想要对话!
IsDialogMessage()
。
您的消息循环应该类似于:
HWND hwnd; // main window handle
MSG msg;
while (GetMessage(&msg, 0, 0, 0) > 0)
{
if (!IsDialogMessage(hwnd, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
IsDialogMessage()
的工作原理是检查消息并查看它是否是 VK_TAB
或相关消息 - 然后它查看传入的 hwnd
以查看其哪个子窗口具有焦点,如果子窗口具有焦点,则搜索对于具有 WS_TABSTOP
样式的其他子窗口,并将焦点移动到窗口中下一个启用 TABSTOP
的控件。使用此功能的窗口不必是对话框,只需具有可以接受焦点的子窗口,并具有 WS_TABSTOP
样式。
工作完美,谢谢。我找不到为什么,在之前应用此解决方案后,我认为不起作用,但仔细观察后,我正在使用另一个窗口的另一个句柄,我现在可以确认,这工作得很好