我在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;
}
Run Code Online (Sandbox Code Playgroud)
当我按Tab键将焦点更改为窗口中的另一个控件时,它什么都不做.我必须以某种方式初始化它吗?
我注意到如果我使用对话框,它已经自动允许使用tab键,Tab键顺序是在.rc文件中创建控件的顺序.
但我不想要对话!
要使Tab键能够在对话框上工作,您需要在消息循环中构建对IsDialogMessage的调用.
您的消息循环应该类似于:
HWND hwnd; // main window handle
MSG msg;
while(GetMessage(&msg,0,0,0)>0)
{
if(!IsDialogMessage(hwnd,&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Run Code Online (Sandbox Code Playgroud)
IsDialogMessage通过检查消息并查看它是否是VK_TAB或相关消息来工作 - 它然后查看传入的hwnd以查看其子窗口中的哪个具有焦点,并且如果子窗口具有焦点,则使用WS_TABSTOP搜索其他子窗口样式,并将焦点移动到窗口上的下一个启用TABSTOP的控件.窗口不一定是使用此功能的对话框,只是具有可以接受焦点的子窗口,并且具有WS_TABSTOP样式.