当前位置: 首页 > 图文教程 > 开发语言 > VC++ > Windows SDK 非模态对话框的消息处理

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 Windows SDK 非模态对话框的消息处理


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 673 ::
收藏到网摘: n/a

Windows SDK 非模态对话框的消息处理

VCKBASE

在SDK中使用非模态对话框时,主循环中必须插入下列代码:
while(GetMessage(&msg,NULL,0,0) { if(!IsDialogMessage(hdlg,&msg){ TranslateMessage(&msg); DispatchMessage(&msg); } } 
我的问题是:
  1. 为什么要调用IsDialogMessage??
  2. 非模态对话框与主窗口有什么区别?
  3. 如果不调用IsDialogMessage,消息能不能传递到对话框?
  4. 如果一定要调用IsDialogMessage,那么如果有多个非模态对话框的话,是否对每一个非模态对话框都必须单独调用IsDialogMessage?如果真是这样,MFC是如何处理的?因为MFC隐藏了主消息循环,我如何增加对IsDialogMessage的调用?

    要搞掂这一连串的问题,首先要明白IsDialogMessage的作用,不要被它的名字搞懵。
IsDialogMessage并不是象它的名字那样用来检查对话框消息的,而是用来解释或转换消息的,更贴切的名字应该是TranslateDialogMessage。

    与TranslateAccelerator有点类似,IsDialogMessage解释非模态对话框消息。例如,它映射Tab键和Shift+Tab键到对话框前/后的控制,并且映射箭头键到对话框相应的操作。你可以将它看成是对话框中专门内建的解释消息的加速键表。实际上,IsDialogMessage不是对话框专用的-你可以在任何有控制的窗口中使用它来实现与在对话框中一样的键盘行为。但是因为它的第一个参数是对话框的HWND,所以实际上你必须应用中的每一个非模态对话框都调用这个函数。通常当你创建对话框时可以获得一个全程的HWND类型变量g_hDlg。

    现在对问题一(为什么要调用IsDialogMessage?)的回答也同时解决了问题四中的前半部分。
    下一个要解决的问题是:MFC如何进行对话框消息的解释?在MFC中使用了一个复杂的虚函数:CWnd::PreTranslateMessage,这个虚函数让任何窗口消息自己进入主消息循环,而不用去修改窗口自身的循环。以下是CDialog::PreTranslateMessage的缺省实现代码:

BOOL CDialog::PreTranslateMessage(MSG* pMsg) { ......// many lines of intimidating code ...... return PreTranslateInput(pMsg); } 
换句话说,CDialog还传递消息到另一个虚函数:CWnd::PreTranslateInput
BOOL CWnd::PreTranslateInput(LPMSG lpMsg) { if (/* keyboard or mouse message */) { return IsDialogMessage(lpMsg); } return FALSE; } 
    你可能想到了CWnd::IsDialogMessage实际上是一个用m_hWnd作为HWND参数调用全程::IsDialogMessage的打包函数。这就导致了MFC中每一个对话框解释自己的输入。如果你同时运行五个对话框,每一个对话框的PreTranslateMessage都调用IsDialogMessage-所以说你就不必做什么了。MFC实在是牛啊,你压根就不必去操心IsDialogMessage,它会自己运转良好。