C++ 如何使tab键在win32非对话框窗口中工作

C++ 如何使tab键在win32非对话框窗口中工作,c++,c,winapi,C++,C,Winapi,我在WM_CREATE message handler的窗口中创建了几个控件,我想允许使用tab键将焦点从一个控件集推进到下一个控件集 控件创建如下所示: case WM_CREATE: { CreateWindowA("button", "Refresh Listview", BS_MULTILINE | WS_CHILD | WS_VISIBLE, 10, 10, 70, 50, hwnd, (HMENU)IDC

我在WM_CREATE message handler的窗口中创建了几个控件,我想允许使用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文件中创建控件的顺序


但我不想要对话

要使选项卡在对话框上工作,您需要在消息循环中构建对的调用

您的消息循环应该如下所示:

HWND hwnd; // main window handle

MSG msg;
while(GetMessage(&msg,0,0,0)>0)
{
  if(!IsDialogMessage(hwnd,&msg))
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
}

IsDialogMessage
通过检查消息并查看其是否为VK_选项卡或相关消息来工作-然后查看传入的hwnd以查看其哪个子窗口具有焦点,如果子窗口具有焦点,则搜索具有WS_TABSTOP样式的其他子窗口,并将焦点移动到窗口上启用TABSTOP的下一个控件。使用此功能时,窗口不必是对话框,只需具有可接受焦点的子窗口,并具有WS_TABSTOP样式。

哇,谢谢。工作完美。我见过这个电话一次,但我认为只有在您使用对话框时才能使用它。非常感谢@Chris对此表示感谢,最近在我的应用程序上成功地打破了标签键和默认键,并修复了它。如果没有你的回答,我永远也不会成功!