我在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文件中创建控件的顺序。
但我不想要对话!
答案 0 :(得分:9)
要让Tab键在对话框上工作,您需要在消息循环中构建对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样式。