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

时间:2010-07-21 12:31:11

标签: 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;
}

当我按Tab键将焦点更改为窗口中的另一个控件时,它什么都不做。我是否必须以某种方式初始化它?

我注意到如果我使用对话框,它已经自动允许使用tab键,Tab键顺序是在.rc文件中创建控件的顺序。

但我不想要对话!

1 个答案:

答案 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样式。