在SDK中使用非模态对话框时的几个问题: 1、为什么要调用IsDialogMessage?? 2、非模态对话框与主窗口有什么区别? 3、如果不调用IsDialogMessage,消息能不能传递到对话框? 4、如果一定要调用IsDialogMessage,那么如果有多个非模态对话框的话,是否对每一个非模态对话框都必须单独调用 IsDialogMessage?如果真是这样,MFC是如何处理的?因为MFC隐藏了主消息循环,我如何增加对IsDialogMessage的调用?

在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。

下一个要解决的问题是: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,它会自己运转良好。

Windows SDK 非模态对话框的消息处理的更多相关文章

  1. Windows编程之非模态对话框

    1  创建非模态对话框 <1>  HWNDCreateDialog(  HINSTANCE hInstance,  // handle to module LPCTSTRlpTemplat ...

  2. 模态对话框与非模态对话框(modeless)

    对话框有两种创建方式:DoModal和Creat. 其中DoModal创建的是模态的对话框,而Creat创建的是非模态的对话框下面总结下他们的不同. 对于模态的对话框,在该对话框被关闭前,用户将不能在 ...

  3. VC++模态对话框和非模态对话框

    MFC中有两种类型的对话框:模态对话框和非模态对话框.  模态对话框是指当其显示时,程序会暂停执行,直到关闭这个模态对话框后,才能继续执行程序中其他任务.非模态对话框是指当其显示时,允许转而执行程序中 ...

  4. c#中的模态对话框和非模态对话框

    模态对话框弹出窗口阻止调用窗口的所有消息响应.只有在弹出窗口结束后调用窗口才能继续.在模态窗口“关闭”后,可以读取模态窗口中信息,包括窗口的返回状态,窗口子控件的值. 非模态对话框可以在弹出窗口和调用 ...

  5. 模态对话框 DoModal的用法 (vs2008)与非模态对话框

    Windows对话框分为两类:模态对话框和非模态对话框. 模态对话框,当它弹出后,本应用程序其他窗口将不再接受用户输入,只有该对话框响应用户输入,在对它进行相应操作退出后,其他窗口才能继续与用户交互. ...

  6. C#模态对话框和非模态对话框

    模态对话框弹出窗口阻止调用窗口的所有消息响应.只有在弹出窗口结束后调用窗口才能继续.在模态窗口“关闭”后,可以读取模态窗口中信息,包括窗口的返回状态,窗口子控件的值. 非模态对话框可以在弹出窗口和调用 ...

  7. MFC编程 | 非模态对话框的定义

    因为课程需要,会用到MFC编程,所以讲一些经验总结下,以便日后使用查询. // 非模态对话框的定义 // 通过单文档菜单调用一个非模态窗口 1.首先在工程里插入一个对话框(如:IDD_DLG_TEST ...

  8. MFC编程入门之十二(对话框:非模态对话框的创建及显示)

    上一节讲了模态对话框及其弹出过程,本节接着讲另一种对话框--非模态对话框的创建及显示. 非模态对话框显示后,程序其他窗口仍然能正常运行,可以响应用户输入,还可以相互切换.上一讲中创建的Tip模态对话框 ...

  9. 非模态对话框的PreTranslateMessage() 没有用,无法进去

    非模态对话框的的PreTranslateMessage确实进不去, 自然也无法用重载PreTranslateMessage的方法来响应键盘消息. 可以用Hook的方法来使其生效. http://bbs ...

随机推荐

  1. go加密算法:非对称加密(二)--Hash

    关于一些加密算法的应用和信息,可以在以下博客中查找到: https://www.cnblogs.com/charlesblc/p/6130141.html // MyHash package main ...

  2. thinkphp5实现定位功能

    一.所需资源链接:百度网盘.主要包含一个ip地址库和一个ip类文件. 二.下载好后,在extend目录下面创建一个location的目录,将下载的文件解压到该目录.给类文件增加一个命名空间,便于我们使 ...

  3. python中的super怎么用?

    面向对象有这个强大特点和作用, 著名的三大特点:封装, 继承, 多态 这篇博客写的是super()的简单理解和使用 今天在读restframework的源码的时候, 发现源码中使用了super, 依以 ...

  4. MYSQL小函数大用途之-------FIND_IN_SET

    没有前言和解释,直接看怎么用 当前我所知道两种用法: 第一种:和like的作用有点相似,但用这个函数会比like更准确的查到你想要的数据. 前提是当前的字段满足俩个要求: 类型为字符型. 储存格式为- ...

  5. 3D立方体

    效果图 主要用到的3D属性 1.保留子元素的3d属性:transform-style:preserve-3d; 2.2D变形属性: ①transform:translate()平移,分X轴,Y轴,Z轴 ...

  6. IDELPHI是一个MIS系统初学者的乐园空间

    DELPHI的长处之一是MIS系统,此空间介绍了MIS中种种问题,及使用DELPHI XE做的办法. 为什么选择DELPHI? DELPHI是开发效率很高的一个工具,但也许很多人都喜欢选择微软.NET ...

  7. vowels_单元音

    vowels(美式): 单元音: [i]:需要用劲喊出类似于“yi”的四声,费力咧开嘴,单词eat.need.thief.meet. [?]:卷舌音,单词bird.her.worry.certain. ...

  8. 串口UART学习笔记(一)

    买了一个开发板学习FPGA,找到的各种东西就记录在这个博客里了,同时也方便把自己不会的问题找到的结果记录一下,都是自己手打,所以可能说的话不那么严谨,不那么精准,看到的人要带着自己的思考去看,记住尽信 ...

  9. mongoengine中queryset触发网络访问机制剖析

    背景 最近新上线的一个服务,偶尔会有超时告警,其主要逻辑仅仅只是简单的读/写mongodb,而且服务上线初期,流量并不大,因而理论上来说,每次请求都应该很快才对,事实上分析日志也证实90%以上的请求都 ...

  10. 成都Uber优步司机奖励政策(4月5日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...