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

在SDK中使用非模态对话框时,主循环中必须插入下列代码:

1. while(GetMessage(&msg,NULL,0,0) {
2. if(!IsDialogMessage(hdlg,&msg){
3. TranslateMessage(&msg);
4. DispatchMessage(&msg);
5. }
6. }

我的问题是:

为什么要调用IsDialogMessage?? 非模态对话框与主窗口有什么区别? 如果不调用IsDialogMessage,消息能不能传递到对话框? 如果一定要调用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的缺省实现代码:

1. BOOL CDialog::PreTranslateMessage(MSG* pMsg)
2. {
3. ......
4. // many lines of intimidating code
5. ......
6. return PreTranslateInput(pMsg);
7. }

换句话说,CDialog还传递消息到另一个虚函数:CWnd::PreTranslateInput

1. BOOL CWnd::PreTranslateInput(LPMSG lpMsg)
2. {
3. if (/* keyboard or mouse message */)
4. {
5. return IsDialogMessage(lpMsg);
6. }
7. return FALSE;
8. }

你可能想到了CWnd::IsDialogMessage实际上是一个用m_hWnd作为HWND参数调用全程::IsDialogMessage的打包函数。这就导致了MFC中每一个对话框解释自己的输入。如果你同时运行五个对话框,每一个对话框的PreTranslateMessage都调用IsDialogMessage-所以说你就不必做什么了。MFC实在是牛啊,你压根就不必去操心IsDialogMessage,它会自己运转良好

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、VC++编程环境介绍 ①、编程环境、编译器; ②、名词解释; ③、一个简单的MFC对话框工程; ④、个人认为在学习过程中可以看的不错书籍; ⑤、VC编译EXE在没装VC的电脑上运行出错问题解决! 2、ANSI与UNICODE ①、ANSI与UNICODE; ②、不同编码格式下的字符串处理及相互转化; ③、CString常用操作讲解。 3、模态对话框模态对话框 ①、模态模态对话框的创建; ②、新对话框的初始化工作; ③、两个对话框之间数据传递的几种方法。 4、对话框控件不同类型成员变量的绑定 ①、控件各种类型变量的绑定、最大值及最小值问题; ②、对话框数据交换与验证机制; ③、各种开源控件类的使用; ④、MFC与SDK API中同名函数问题。 5、VC中常用控件的用法讲解 ①、VC中常用控件的用法讲解见:http://www.cctry.com/thread-106-1-1.html ②、VS2008中新增控件的用法讲解。 6、定时器讲解 ①、定时器相关函数讲解:SetTimer、OnTimer、KillTimer; ②、利用定时器实现动态显示时间; ③、改变CStatic控件的文字颜色。 7、MFC对话框程序响应鼠标及键盘消息 ①、MFC对话框程序响应鼠标点击消息; ②、MFC对话框程序响应键盘按键消息; ③、MFC对话框程序响应组合键。 8、MFC对话框注册全局系统热键 9、控件自定义消息的响应: ①、响应按钮控件的右键消息; ②、响应Static控件的双击消息。 ③、自定义编辑框控件只读、颜色不变灰 10、再论“逃跑”按钮的实现 ①、MoveWindow、SetWindowPos、GetWindowRect函数讲解; ②、坐标系的变换。 11、通用对话框讲解 ①、文件选择对话框; ②、目录选择对话框; ③、让对话框程序支持拖拽。 12、菜单操作 ①、对话框程序添加菜单; ②、右键弹出式菜单; ③、菜单项的启用与禁用。 13、对话框的工具栏操作 ①、工具栏的创建; ②、工具栏按钮的响应。 14、对话框的状态栏操作 ①、状态栏的创建; ②、状态栏显示时钟、鼠标位置、鼠标点的颜色信息等。 15、一个简单计算器软件的编写 ①、计算功能的实现; ②、剪贴板操作:将计算结果保存到剪贴板。 16、文件的基本操作之CFile[Ⅰ] ①、文件的创建、打开、关闭; ②、文件的读写、何时读取完毕、读取一行数据; ③、文件指针位置的设置; ④、刷新缓存数据到文件; 17、文件的基本操作[Ⅱ] ①、文件的复制[适用于文件夹]; ②、文件的重命名或移动[适用于文件夹]; ③、文件的删除[只读属性]; 18、文件属性信息的获取与设置 ①、属性信息的获取:大小、时间、隐藏属性等; ②、属性信息的设置 [删除只读属性文件]; ③、判断文件是否存在以及是否为目录; 19、文件夹操作 ①、文件夹的创建与删除; ②、文件夹的属性信息的获取:时间、隐藏属性等; ③、文件夹大小的获取:遍历文件方法[下节课讲解]; 20、文件的遍历与查找小软件的编写[包括文件的各种属性信息] 21、系统各种路径信息的获取 ①、Windows、System32、temp、桌面目录、我的文档等目录的获取; ②、应用程序当前目录的获取与设置及存在的问题讲解; ③、可执行文件所在目录[包括EXE和DLL]; ④、工程当前目录与Debug调试目录的不同。 22、系统信息的获取 ①、当前用户名称、计算机名称的获取; ②、CPU、内存、硬盘信息的获取。 23、进程的相关操作 ①、进程创建的三种方法及CreateProcess参数存在的问题; ②、进程的结束; 进程的枚举 一个简单任务管理器的实现 MFC中动态数组、动态链表、映射表的讲解 ClistCtrl 的自绘操作!
基础篇 1. 开始 …………………… WINDOWS环境 …………………… WINDOWS程序设计选项 …………………… 编写第一个WINDOWS程序 2.Unicode简介 …………………… 字符集简史 …………………… 宽字符和C …………………… 宽字符和WINDOWS 3. 窗口和消息 …………………… 自己的窗口 …………………… WINDOWS程序设计的难点 4. 输出文字 …………………… 绘制和更新 …………………… GDI简介 …………………… 滚动条 …………………… 建立更好的滚动 5. 图形基础 …………………… GDI的结构 …………………… 设备内容 …………………… 画点和线 …………………… 绘制填入区域 …………………… GDI映像方式 …………………… 矩形、区域和剪裁 6. 键盘 …………………… 键盘基础 …………………… 按键消息 …………………… 字符消息 …………………… 键盘消息和字符集 …………………… 插入符号(不是光标) 7. 鼠标 …………………… 鼠标基础 …………………… 显示区域鼠标消息 …………………… 显示区域鼠标消息 …………………… 程序中的命中测试 …………………… 拦截鼠标 …………………… 鼠标滑轮 8. 定时器 …………………… 定时器入门 …………………… 定时器的使用:三种方法 …………………… 定时器用于时钟 …………………… 以定时器进行状态报告 9. 子窗口控件 …………………… 按钮类别 …………………… 控件与颜色 …………………… 静态类别 …………………… 滚动条类别 …………………… 编辑类别 …………………… 清单方块类别 10. 菜单及其它资源 …………………… 图标、光标、字符串和自订资源 …………………… 菜单 …………………… 键盘快捷键 11. 对话框 …………………… 模态对话框 …………………… 模态对话框 …………………… 通用对话框 12. 剪贴簿 …………………… 剪贴簿的简单使用 …………………… 复杂的剪贴簿用法 …………………… 实作剪贴簿浏览器 -------------------------------------------------------------------------------- 图像篇 13. 使用打印机 …………………… 打印入门 …………………… 打印图形和文字 14. 位图和Bitblt …………………… 位图入门 …………………… 位图尺寸 …………………… 位块传输 …………………… GDI位图对象 15. 与设备无关的位图 …………………… DIB文件格式 …………………… 显示和打印 …………………… DIB和DDB的结合 16. 调色盘管理器 …………………… 使用调色盘 …………………… 调色盘动画 …………………… 调色盘和真实世界图像 …………………… DIB处理链接库 17. 文字和字体 …………………… 简单的文字输出 …………………… 字体的背景 …………………… 逻辑字体 …………………… 字体列举 …………………… 段落格式 …………………… 有趣的东西 18. Metafile …………………… 旧的 MetaFile 格式 …………………… 增强型 MetaFile -------------------------------------------------------------------------------- 进阶篇 19. 多重文件界面 …………………… MDI概念 …………………… MDI的范例程序 20. 多任务和多线程 …………………… 多任务的各种模式 …………………… WINDOWS的多线程处理 …………………… 线程同步 …………………… 事件信号 …………………… 线程区域储存空间(TLS) 21. 动态链接库 …………………… 动态链接库的基本知识 …………………… 各式各样的DLL讨论 22. 声音与音乐 …………………… WINDOWS和多媒体 …………………… 波形声音 …………………… MIDI和音乐 23. 领略Internet …………………… Windows Sockets …………………… WININET和FTP
这是一本填补“使用向导”类的VisualC++书籍、产品文档以及MFC源代码之间空隙的MFC书籍。本书是了解MFC内幕的向导,提供了关于那些没有文档记录的MFC类、实用函数和数据成员的独一无二并且透彻的信息,介绍了有用的编码技巧,并对MFC各个类之间的协作方式进行了重要的分析。 本书的第一部分包含了核心的MFC图形用户界面类以及支持它们的类,第二部分包含了像OLE这种扩展基本Windows支持的主题。如果做到以下几点,你就可以成为一位透彻理解MFC实现细节的专家:探索MFC文档/视图结构的内幕,从而学习视图同步、打印和打印预览;更深入地了解MFC序列化中那些没有文档记录的方面和一些没有文档记录的类,例如CPreview、CPreviewDC、CMirrorFile以及CDockBar等等;最后理解MFC 和OLE是如何共同运作的,以及OLE控悠扬是如何实现的;积累技巧,学会自己研究和理解MFC源代码。 目录: 前言 致谢 简介 第1章 MFC的概念性总括 面向对象编程的一些背景 面向对象编程术语 通常的对象 对象与C++ 为什么使用OOP 应用程序框架与MFC MFC要点之旅 结语 第2章 基本的Windows支持 MFC与C/SDK 基本的MFC应用程序组件 现在,找到WinMain() 一些其他隐藏的信息 MFC对GDI的支持 结语 第3章 MFC中的消息处理 CCmdTarget和消息映射表 窗口消息 MFC消息映射内幕 MFC如何使用消息映射表 进入消息循环:PreTranslateMessage() 结语 第4章 MFC实用类 简单值类型 MFC的集合类 CFile家族:MFC对文件的访问 CExcephon:提供更好的错误处理 结语 第5章 CObject 使用CObject的代价 CObject的特性 宏的介绍 运行时类的信息 MFC中的持续性 CObject对诊断的支持 CObject的诊断支持内幕 组合在一起 投入使用 是否值得 结语 第6章 MFC对话框和控件类 CDialog:模态MFC对话框模态MFC对话框 MFC公用对话框 OLE对话框 属性页(也称带标签的对话框) MFC控件类 结语 第7章 MFC的文档/视图结构 为什么要用文档/视图 其他原因 旧的方法 体系结构 文档/视图结构内幕 文档舰图内幕再览 结语 第8章 高级文档舰图结构内幕 CMirrorFile CView打印 CView对打印预览支持的内幕 CView的派生类:CScrollView CView的另一个派生类:CCtrlView 结语 第9章 MFC的增强型用户界面类 CSplitterWnd:MFC分割窗口 MFC的CControlBar体系结构 CMiniFrameWnd MFC的MRU文件链表实现 结语 第10章 MFC的DLL与线程 理解状态 MFC的DLL MFC线程 结语 下一章 第11章 用MFC实现COM MFC和OLE COM 何为COM类 COM接口 GUID 剖析IUnknown接口 COM对象服务器 拥有多个接口的COM类 MFCCOM类 使用MFC创建CoMath MFCCOM和接口映射宏 使用MFC的CoMath类 完成服务器的设计 MFC对类厂的支持 结语 第12章 统一数据传输和MFC 历史回顾 重要的结构 IDataObject接口 OLE剪贴板 MFC的IDataObjeot类 延迟供应 深入了解MFC的IDataObject类 OLE拖放 结语 第13章 使用MFC实现OLE文档 OLE文档101 MFC对OLE文档的支持 使用MFC实现OLE文档服务器 容器朋艮务器的协调工作 使条目无效 保存容器的文档 装载OLE文档 结语 第14章 MFC与自动化 自动化的历史 自动化的功能 使用MFC实现自动化应用程序 自动化的工作机制 COM接口与自动化 实现自动化的另外一种方法:使用类型信息 MFC与自动化 结语:使用“MFC方式”的结果 第15章OLE控件 VBX及其缺陷 OLE控件 写一个OLE控件 在工程里使用OLE控件 它是如何工作的 MFC和OLE控件的容器 OLE控件的生存周期 OLE连接 OLE控件的事件 MFC如何处理事件 技巧:在一个视图中加入一个事件接收器 OLE控件的属性页 结语 附录A MFC源代码导读 MFC编码技术 探索MFC的工具 MFC源代码指南 愉快的旅途 附录B 本书的示例代码 术语表

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值