我正在使用一个主窗口和一个无模式对话框创建一个简单的win32程序。
我知道使用IsDialogMessage()程序会将消息调度到无模式窗口(如键盘事件)。
// step 3: The Message Loop
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
if(!IsDialogMessage(g_hToolbar, &Msg))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}
但是如果不使用IsDialogMessage(),无模式窗口仍会获得点击和鼠标调度的其他事件等事件。
为什么呢?如果主循环没有向它发送消息,那么这种无模式如何获取这些消息呢?
我只是想知道它是如何在内部运作的。
答案 0 :(得分:9)
IsDialogMessage过滤掉一些消息,但允许大多数消息命中消息循环的TranslateMessage / DispatchMessage部分并正常调度。
IsDialogMessage必须处理某些消息的原因是消息将被传递到错误的窗口。
考虑 - 通常 - 按键消息以焦点传递给控件。但是,Tab键击是用于将焦点移动到对话框上的下一个控件。 IsDialogMessage不是让每个控件都必须处理Tab键,而是在将它们传递给实际当前聚焦的控件之前捕获Tab键击,并确保对话框代码处理制表符逻辑。
大多数其他消息 - 鼠标悬停和绘画等 - 无论如何都将被传递到对话框窗口过程 - 因此以正常方式处理。它实际上只是发往控件的消息子集,但需要由对话框处理,即IsDialogMessage过滤掉并处理。
答案 1 :(得分:4)
模态窗口将禁用其父窗口,您的HWND被称为g_hToolbar这一事实告诉我这不是模态对话框......
模态对话框(DialogBox*)创建自己的消息循环(和MessageBox等一样工作),你必须谈论无模式对话框(CreateDialog*)你将从窗口获取所有消息经理没有IsDialogMessage,IsDialogMessage执行对话管理器任务,如处理TAB和默认按钮焦点。
有关在非对话框窗口中使用IsDialogMessage的信息,请参阅this博文。有关对话管理器以及如何编写自己的对话管理器的详细概述,请参阅this post series。
答案 2 :(得分:0)
如果没有IsDialogMessage,某些对话框功能(如按下Tab键时更改焦点)不起作用。 IsDialogMessage实现了这些特定于对话框的功能。如果它返回TRUE,则已处理当前消息,并且无需调用TranslateMessage和DispatchMessage。