我想让标签按钮在我的应用上运行,所以当我按下标签时,它会从一个编辑框变为另一个,这些是编辑框代码:
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);
答案 0 :(得分:5)
修复非常简单。鉴于您正在处理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函数适用于无模式对话框,但您可以将其用于包含控件的任何窗口,从而使窗口能够提供与对话框中使用的相同的键盘选择。 当IsDialogMessage处理消息时,它会检查键盘消息并将其转换为相应对话框的选择命令。例如,按下TAB键时,选择下一个控件或一组控件,按下DOWN ARROW键,选择组中的下一个控件。
因为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);
}
}
答案 1 :(得分:1)
据我记忆,你应该只在第一个条目上使用WS_GROUP
。以下所有子窗口都将添加到该组中。创建新组时,在创建的第一个窗口上再次使用WS_GROUP
。
因此,请将WS_GROUP
保留在TextBox
上,然后将其从其他窗口中移除。
您可以在MSDN上阅读此内容。
您还应该在消息循环中使用IsDialogMessage
。您可以看到example here。
答案 2 :(得分:0)
我有类似的问题,发现在TramnslateMessage和DispatchMessage(如接受的答案中所示)之前添加IsDialogMessage语句解决了我的问题。