如何使非对话框的win32窗口支持tab键?

8

我在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个回答

17
为使选项卡功能正常工作,需要在消息循环中添加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 样式。


哇,谢谢。完美运作。我曾经看到过这个调用,但我认为它只能在使用对话框时使用。非常感谢! - Kaije
@Chris 谢谢你,最近我的应用程序无法使用 Tab 和默认键,但是通过你的答案解决了这个问题。如果没有你的回答,我永远不会想到这个解决方法! - David Hall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接