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

标签 c++ oop winapi

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

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

当我到达最后一个编辑控件时,代码不起作用,::GetWindow 只是返回行 (?) 中的下一个窗口,它恰好是一个非父类(super class)编辑控件。并且还有更多的隐藏子窗口(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;
}

最佳答案

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

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

不要忘记设置 WS_EX_CONTROLPARENT extended window style在父窗口上,以便对话框管理器递归到子窗口中。

关于c++ - 使用 Tab 在编辑控件之间切换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18035999/

相关文章:

c++ - g++ 4.5 找不到友元函数

c++ - 运算符 '*' 不明确 (C++)

类变量中的Python静态继承

Java - 在 HashSet 中搜索对象的字段

winapi - Office 2013如何实现IRM黑窗?

C++ Windows 已触发断点 - 堆损坏

c++ - C++ 流中的eof()、fail()、bad() 和good() 之间有什么区别?

java - 我如何引用它所扩展的类所引用的对象的[非抽象]字段?

c++ - FileCopyExW 将最后一个错误报告为 ERROR_NOT_SUPPORTED - 这对于 FileCopyExW 意味着什么

c - LoadLibrary是否解析%windir%等环境变量