关闭对话框,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/118981.html原文链接:https://javaforall.net

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


相关推荐

  • 面试题总结 —— JAVA高级工程师[通俗易懂]

    面试题总结 —— JAVA高级工程师[通俗易懂]面试题总结——JAVA高级工程师近期考虑换工作的问题,于是投简历面试,面试5家公司的高级Java工程师,有4家给了我offer,想着总结一下面试经验,方便最近正在寻求机会的你们一、无笔试题不知道是不是职位原因还是没遇到,面试时,都不需要做笔试题,而是填张个人信息表格,或者直接面试二、三大框架方面问题1、Spring事务的隔离性,并说说每个隔离性的…

    2022年6月14日
    27
  • jquery Ajax请求中显示Loading…

    jquery Ajax请求中显示Loading…

    2021年9月7日
    113
  • Cinemachine(二)制作不会穿墙(会避开障碍物)的摄像头(Cinemachine Collider)

    Cinemachine(二)制作不会穿墙(会避开障碍物)的摄像头(Cinemachine Collider)在许多的第三人称游戏中,我们的摄像机往往保持着一定的偏移,跟随着我们的角色。但是常常会出现的一种情况就是,当我们的角色走进室内或者靠近墙边或障碍物的时候,如果这个偏移保持不变的话,我们的摄像机就可能会跑到墙体里,或者看向角色时被墙体或障碍物所挡住。因此这种情况下我们的相机往往需要一些特殊的处理,例如修改偏移量来拉近相机与角色的距离等,来防止上述情况的出现。在以往我们可能需要通过射线检测或者碰撞检测等,然后编写一大堆的代码做一堆复杂的判断来修改我们的摄像机的位置。视频链接:https://www.bi

    2022年5月8日
    96
  • Word修改默认字体

    Word修改默认字体在Win10的最近一次更新后,发现我的office365默认字体都给我改成等线,什么鬼,以前都是宋体,现在这个还真的不习惯,就动手修改默认字体,设置如下: 1、在word空白处点击鼠标右键,选择字体。 2、在弹出框设置样式(字体、大小等),设置完成之后点击设置默认值3、选择如下,点击确定即可。后面再创建word就默认是设置的字体以及大小。…

    2022年6月13日
    42
  • Linux CentOS 7 中ssh界面乱码

    Linux CentOS 7 中ssh界面乱码

    2022年4月3日
    44
  • 何时使用数据库存储过程

    何时使用数据库存储过程

    2021年8月21日
    61

发表回复

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

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