关于WIN32中的IsDialogMessage()的问题

时间:2010-12-08 13:18:23

标签: c winapi

我正在使用一个主窗口和一个无模式对话框创建一个简单的win32程序。

我知道使用IsDialogMessage()程序会将消息调度到无模式窗口(如键盘事件)。

// step 3: The Message Loop
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
    if(!IsDialogMessage(g_hToolbar, &Msg)) 
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
}

但是如果不使用IsDialogMessage(),无模式窗口仍会获得点击和鼠标调度的其他事件等事件。

为什么呢?如果主循环没有向它发送消息,那么这种无模式如何获取这些消息呢?

我只是想知道它是如何在内部运作的。

3 个答案:

答案 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。

相关问题