使用 Tab 在编辑控件之间切换?

Stu*_*ntX 2 c++ oop winapi

该窗口不是基于对话框的,因此 WS_TABSTOP 不起作用。此外,我不想按 Tab 键浏览所有控件,我只想按 Tab 键浏览几个编辑控件。

我所做的是对编辑控件进行超类化并处理 WM_KEYDOWN 消息,在编辑控件之间切换,通过 ::GetWindow(hwnd,GW_HWNDNEXT); 获取行中的下一个窗口;另外,当我到达最后一个编辑控件时,我想将焦点切换回第一个编辑控件。

当我到达最后一个编辑控件时,代码不起作用,::GetWindow 只是返回行中的下一个窗口(?),它恰好是非超类编辑控件。并且还有更多隐藏子窗口(SW_HIDE)。

也许我知道如何知道窗口 HWND 的类名?

注意:纯Win32 api,c++ oop。

else if (  ( int ) wParam == VK_TAB  )
{
   HWND nextInLine;
   nextInLine = ::GetWindow ( hwnd, GW_HWNDNEXT );
   if ( hwnd == NULL )  nextInLine = ::GetWindow ( hwnd, GW_HWNDPREV );
   ::SendMessage ( nextInLine, EM_SETSEL, ( WPARAM ) 0, ( LPARAM ) -1 );
   ::SetFocus ( nextInLine );
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

IIn*_*ble 5

通过使用 API 调用,您可以在任何窗口中免费获得键盘导航IsDialogMessage。要使用该服务,必须修改窗口消息循环以包含对IsDialogMessage常规消息处理的调用,并且仅将消息传递给常规消息处理(如果对话管理器尚未处理该消息)。

MSG msg = { 0 };
while (GetMessage(&msg, NULL, 0, 0)) {
    if (IsDialogMessage(hwnd, &msg)) {
        /* Already handled by dialog manager */
    } else {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}
Run Code Online (Sandbox Code Playgroud)

不要忘记在父窗口上设置WS_EX_CONTROLPARENT 扩展窗口样式,以便对话框管理器递归到子窗口中。