在我的Win32应用程序中使TAB键起工作
Making TAB key work in my win32 app
我想在我的应用程序上使"选项卡"按钮工作,因此,当我按下选项卡时,它将从一个编辑框更改为另一个编辑框,这些是编辑框代码:
case WM_CREATE:
TextBox = CreateWindow("EDIT",
"",
WS_BORDER|WS_CHILD|WS_VISIBLE|WS_EX_LAYERED|WS_TABSTOP|WS_GROUP,
60,50,200,20,
hwnd,NULL,NULL,NULL);
DataBox = CreateWindow("EDIT",
"",
WS_BORDER|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_GROUP,
60,72,200,20,
hwnd,NULL,NULL,NULL);
MotivBox = CreateWindow("EDIT",
"",
WS_BORDER|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_GROUP,
60,92,200,20,
hwnd,NULL,NULL,NULL);
PretBox = CreateWindow("EDIT",
"",
WS_BORDER|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_GROUP,
60,112,200,20,
hwnd,NULL,NULL,NULL);
修复程序非常简单。鉴于您正在处理WM_Create消息,而不是WM_Initdialog消息,因此可以肯定地假设您将控件添加到"标准"窗口中,而不是"对话框"。
考虑到这一点,我希望您在Winmain中有类似以下内容:
/* Run the message loop. It will run until GetMessage() returns 0 */
while (GetMessage (&messages, NULL, 0, 0))
{
/* Translate virtual-key messages into character messages */
TranslateMessage(&messages);
/* Send message to WindowProcedure */
DispatchMessage(&messages);
}
但是,IsDialogMessage
的文档状态:
"尽管ISDialogMessage函数旨在用于无模型对话框,但您可以将其与任何包含控件的窗口一起使用,从而使Windows能够提供与对话框中使用的相同键盘选择。 当IsdialogMessage处理消息时,它会检查键盘消息,并将其转换为相应的对话框的选择命令。例如,按下时,"选项卡键"选择下一个控件或组的控件组,然后按下时向下箭头键选择组中的下一个控件。
因为IsdialogMessage函数执行了所有必要的翻译和调度消息,因此不得将IsdialogMessage处理的消息传递给TranslateMessage或DispatchMessage函数。"
因此,您可以更改消息泵以类似于以下内容:
/* Run the message loop. It will run until GetMessage() returns 0 */
while (GetMessage (&messages, NULL, 0, 0))
{
/* Translate virtual-key messages into character messages */
if (IsDialogMessage(hwnd, &messages) == 0)
{
TranslateMessage(&messages);
/* Send message to WindowProcedure */
DispatchMessage(&messages);
}
}
据我所知,您应该仅在第一个条目时使用WS_GROUP
。以下所有以下ChildWindows都将添加到该组中。创建一个新组时,您可以在创建的第一个窗口上再次使用WS_GROUP
。因此,将WS_GROUP
保留在TextBox
上并将其删除,形成其他窗口。
您可以在MSDN上阅读此信息。
您还应在消息循环中使用IsDialogMessage
。您可以在此处看到一个示例。
我也有类似的问题,发现在tramnslatemessage和dispatchMessage之前添加isDialogMessage语句(如接受的答案所示)解决了我的问题。
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 在我的Win32应用程序中使TAB键起工作
- 带Alt+Tab键的WH_KEYBOARD停止工作
- TAB键不能在COM框架的MFC应用程序中工作.但是,方向键可以工作