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

VC++
用 auto_ptr 类模板帮助动态内存管理
走近 STL
一步一步学STL标准模板库
使用 <multimap> 库创建重复键关联容器
使用 <map> 库创建关联容器
用 vectors 改进内存的再分配
用函数模板实现和优化抽象操作
STL 字符串类与 UNICODE 及其它......
如何在Dll中导出STL类
再谈“在STL列表(Lists)中插入不同类型的对象”
使用::std::vector<>作为管理动态数组的优先选择
三种常见中文内码的转换方法
JNI 中文处理问题小结
构建 GB2312 汉字库的 unicode 码表
正则表达式简介
在非MFC程序中引用CString
UTF-8与GB2312之间的互换
宽字符标量L"xx"在VC6.0/7.0和GNU g++中的不同实现
用VC++设计语法编辑器
C语言中对时间和日期的处理

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 683 ::
收藏到网摘: 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,它会自己运转良好。