我正在创建一个简单的win32程序,其中包含一个主窗口和一个无模式对话框.
我知道使用IsDialogMessage()程序会将消息调度到无模式窗口(如键盘事件).
// step 3: The Message Loop
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
if(!IsDialogMessage(g_hToolbar, &Msg))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,在不使用IsDialogMessage()的情况下,无模式窗口仍会获得诸如click和鼠标调度的其他事件之类的事件.
为什么?如果主循环没有向它发送消息,那么这种无模式如何获取这些消息呢?
我只是想知道它是如何在内部工作的.
Chr*_*cke 10
IsDialogMessage过滤掉一些消息,但允许大多数消息命中消息循环的TranslateMessage/DispatchMessage部分并正常调度.
IsDialogMessage必须处理某些消息的原因是消息将被传递到错误的窗口.
考虑 - 通常 - 按键消息以焦点传递给控件.但是,Tab键击是用于将焦点移动到对话框上的下一个控件.IsDialogMessage不是让每个控件都必须处理Tab键,而是在将它们传递给实际当前聚焦的控件之前捕获Tab键击,并确保对话框代码处理Tab键逻辑.
大多数其他消息 - 鼠标悬停和绘画等 - 无论如何都将被传递到对话框窗口过程 - 因此以正常方式处理.它实际上只是发往控件的消息子集,但需要由对话框处理,即IsDialogMessage过滤掉并处理.