关闭对话框,OnClose和OnCancel

关闭对话框,OnClose和OnCancel

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

      我们知道,在对话框中,屏蔽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() 返回 后,假设採用消息,我认为是否应该不会在返回后调用,而应该在消息发送后立即处理。

      

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118554.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 理解class.forName()

    理解class.forName()

    2021年11月28日
  • 各代iphone尺寸_iphone屏幕尺寸比例是多少,iphone各代屏幕尺寸大小介绍

    各代iphone尺寸_iphone屏幕尺寸比例是多少,iphone各代屏幕尺寸大小介绍自2007年苹果发布第一代iPhone以来,到目前最新的iPhoneXS、XSMax,苹果累计发布了21款手机,涉及7款尺寸,8种分辨率。那么这么多的不同手机之间有什么内在联系吗?为什么在iPhone6代-8代之间,屏幕是4.7寸和5.5寸,而iPhoneXS和Max分别是5.8寸和6.5寸,他们之间有什么联系吗?XR为什么分辨率这么低,被吐槽是大果粒屏?仔细看完本文,你将对iPhone的设…

    2022年5月14日
  • 详述 Java 语言中的格式化输出

    详述 Java 语言中的格式化输出1前言相信大家在学习Java语言的时候,见到的第一条输出语句,就是:System.out.println(“HelloWorld”);毫无疑问,该语句的作用就是将HelloWorld打印到控制台,格式也非常的简单,直接按原格式输出。但是,如果将输出的内容换成“数值”或者“日期”呢?其打印的格式是否会有什么不同的变化呢?在本文中,就让咱们一起看一看在Java语言中,数值和日期是如何进行格

    2022年7月8日
  • 通过反射获取实例化

    通过反射获取实例化IMyServlet接口packagecn.itheima.web.servlet;publicinterfaceIMyServlet{publicvoidinit();publicvoidservice();publicvoiddestory();}接口的实现packagecn.itheima.web.servlet;publicclassMy

    2022年7月12日
  • idea切换到远程分支_git看不到远程分支

    idea切换到远程分支_git看不到远程分支描述最近项目建了分支,在并行开发,需要切换远程分支,在网上找了很多资料都不行。远程分支代码始终更新的是其他分支。解决方案话不多说,直接看图。操作上述之后,开始pull下远程代码,完毕后也可发现分支发生变化说明以上只在2016.1.3上验证。

    2022年9月21日
  • PHP获取客户端IP

    functiongetIP(){if(getenv(‘HTTP_CLIENT_IP’)){$ip=getenv(‘HTTP_CLIENT_IP’);}elseif(getenv(‘HTTP_X_FORWARDED_FOR’)){$ip=getenv(‘HTTP_X_FORWARDED_FOR’);}…

    2022年4月4日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号