如何使用不是对话框的win32窗口使Tab键按下

Kai*_*ije 4 c c++ winapi

我在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文件中创建控件的顺序.

但我不想要对话!

Chr*_*cke 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

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