我们知道,在对话框中,屏蔽ESC键自己主动退出能够选择重载OnCancel为哑函数的方法:

void CXXXXDlg::OnCancel()
     {
        // TODO: Add your specialized code here and/or call the base class

//CDialog::OnCancel(); //disable OnCancel

     }

可是,这样一来,右上角的关闭button也不起作用了,是由于点击关闭button时会自己主动调用CXXXXDlg::OnCancel()l从而完毕对话框的关闭,由于CXXXXDlg::OnCancel()中什么也没有做,因此对话框就无法关闭。改动这个bug须要重载OnClose消息函数:

void CXXXXDlg::OnClose()
      {
            // TODO: Add your message handler code here and/or call default

CDialog::OnCancel();  //add OnCancel here

CDialog::OnClose();           
      }

因为OnCancle实际上是调用Enddialog(IDCANCEL),所以也能够依照例如以下改动:

void CXXXXDlg::OnClose()
      {
            // TODO: Add your message handler code here and/or call default

EndDialog(IDCANCEL);

CDialog::OnClose();           
      }

我们知道OnClose函数是WM_CLOSE消息的响应函数,可是为什么发送WM_CLOSE消息后会自己主动调用CXXXXDlg::OnCancel()?自己跟了一下代码,大致梳理了一下流程:

           WM_CLOSE

     -> 进入void CXXXXDlg::OnClose()

     -> CDialog::OnClose()      

     ->

void CXXXXDlg::OnClose()返回


     -> void CXXXXDlg::OnCancel()

比較奇妙的是

CDialog::OnClose()

函数:

这个函数中不知道以何种方式告知系统在

CXXXXDlg::OnClose()
返回

后去调用

CXXXXDlg::OnCancel(),在调试中假设把这个函数凝视掉,则不会转入CXXXXDlg::OnCancel()函数中。并且,对于CXXXXDlg::OnCancel()函数的调用是在CXXXXDlg::OnClose()
返回

后,假设採用消息,我认为是否应该不会在返回后调用,而应该在消息发送后立即处理。

网上找了非常久也没有得到答案,临时记录在此,或许哪天自己明确了,或是被牛人发现了给出解答。

关闭对话框,OnClose和OnCancel的更多相关文章

  1. 20151124001 关闭C#主窗体弹出是否关闭对话框

    关闭C#主窗体弹出是否关闭对话框 private void Frm_Main_FormClosing(object sender, FormClosingEventArgs e)        {   ...

  2. JQuery Dialog 禁用X按钮关闭对话框,-摘自网络

    JQuery Dialog 禁用X按钮关闭对话框,禁用ESC键关闭代码如下:$("#div1").dialog({   closeOnEscape: false,   open: ...

  3. 关闭C#主窗体弹出是否关闭对话框

    在开发系统时,常常有这样一个问题,就是当关闭主窗体,也即退出系统时,如果想提示是否关闭,以免误操作,可以在主窗体的Main_FormClosing事件中添加一个对话框,代码如下: private vo ...

  4. Android系统原理与源码分析(1):利用Java反射技术阻止通过按钮关闭对话框

    原文出处:博主宇宙的极客http://www.cnblogs.com/nokiaguy/archive/2010/07/27/1786482.html 众所周知,AlertDialog类用于显示对话框 ...

  5. mui 对话框 点击按钮不关闭对话框的办法

    目前版本的 mui.js 点击对话框的按钮只能关闭对话框 做如下修改 点击按钮后return false 即可

  6. Android——点击对话框上按钮不关闭对话框

    有时候我没可能需要在点击按钮进行一些检测,但是并不想关闭次对话框(系统默认点击任何一个按钮则关闭对话框),处理方法如下:在点击事件下添加如下代码: try { Field field = dialog ...

  7. vue + ElementUI 关闭对话框清空验证,清除form表单

    前面跟大家提到过 elementUI验证的问题,那么今天就来看看 点击对话框和关闭按钮 怎么清空验证,清空form表单,避免二次点击还会有 验证错误的提示 1.首先在你的对话框 取消按钮 加一个cli ...

  8. Android——点击对话框上button不关闭对话框

    有时候我没可能须要在点击button进行一些检測.可是并不想关闭次对话框(系统默认点击不论什么一个button则关闭对话框),处理方法例如以下:在点击事件下加入例如以下代码: try { Field  ...

  9. MFC对话框程序 屏蔽ESC和ENTER键关闭对话框的方法

    http://blog.csdn.net/xgx198831/article/details/6713651 MFC对话框程序  屏蔽ESC和ENTER键关闭对话框的方法 或许还有其它更好的办法,但下 ...

随机推荐

  1. UIWebView1-b

    随着H5的强大,hybrid app已经成为当前互联网的大方向,单纯的native app和web app在某些方面显得就很劣势.关于H5的发展史,这里有一篇文章推荐给大家,今天我们来学习最基础的基于 ...

  2. ASP.NET State Service服务

    ASP.NET State Service服务是用来管理 Session 的,正常来说,Session 位于IIS进程中(其实可以理解成在服务器的内存中),当IIS重启或程序池回收会自动清空Sessi ...

  3. Error Code: 1064 – You have an error in your SQL syntax解决几个方法

    本文转自 http://www.anyiwa.com/?p=1066 Error Code: 1064 – You have an error in your SQL syntax解决几个方法 十一月 ...

  4. BZOJ 1636: [Usaco2007 Jan]Balanced Lineup

    noip要来了,刷点基础水题. 题意: RMQ,给你N个数,Q个询问,每次查询[l,r]内,最大值减最小值是多少. 写的ST. 代码: #include<iostream> #includ ...

  5. 广州麒麟网络工作室 qlgame eninge(anroid) opengles c++ matrix

    在opengles中,采用的是可编程渲染管线,矩阵需要自己实现! 先说一下矩阵的理论: 参考一下资料:http://blog.sina.com.cn/s/blog_6084f588010192ug.h ...

  6. UML 中关系详解以及在visio中的表示

    http://www.cnblogs.com/kittywei/archive/2013/05/15/3079536.html

  7. CRC算法及C实现

    一.CRC算法原理   CRC校验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校 验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数 ...

  8. duilib入门简明教程 -- VS环境配置(2) Alberl

      既然是入门教程,那当然得基础点,因为搜索duilib相关资料时,发现有些小伙伴到处都是编译错误,以及路径配置错误等等,还有人不知道SVN,然后一个个文件手动下载的.     其实吧,duilib的 ...

  9. 解析Android开发优化之:对Bitmap的内存优化详解

    在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常.所以,对于图 ...

  10. jni.h头文件详解一

    1.jni.h头文件路径: /usr/lib/jvm/jdk_1.6.0_43/include/jni.h 2.jni.h头文件组成分析图: 3.下面通过上图进行分析讲解jni.h头文件. 一. jn ...