如何让 Tab 键在非对话框的 win32 窗口中工作

问题描述 投票:0回答:2

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

但我不想要对话!

c++ c winapi
2个回答
17
投票

要使 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
样式。


0
投票

工作完美,谢谢。我找不到为什么,在之前应用此解决方案后,我认为不起作用,但仔细观察后,我正在使用另一个窗口的另一个句柄,我现在可以确认,这工作得很好

© www.soinside.com 2019 - 2024. All rights reserved.