MFC程序中各种退出程序接口函数的路由,右上角“叉叉”、“确认”(Enter键)、“取消”(ESC键)等功能函数的关闭路由

 MFC自动生成的对话框中包含“确定”和“取消”按钮。其对应的ID分别为IDOK和IDCANCLE,对应函数为OnOK()和OnCancle()。

MFC中默认Enter键可以触发对OnOK函数的调用,Esc键触发对OnCancel函数的调用。它将导致控制从对话框中退出。

禁用Esc键的退出功能很简单:

    1、双击“取消”按钮,添加响应函数OnCancle()

    2、把向导生成的父类调用注释掉

       void CEMDTTDlg::OnCancel() {
            // CDialog::OnCancel();   //禁用父类调用
       }

  

对话框默认用的两个按钮的ID分别是IDOK和IDCANCEL,这两个都是在winuser.h 中预定义的系统标准控件ID。
对于标准ID,不重载时MFC会自动调用父类的相应处理函数。
比如IDOK映射到CDialog::OnOK()函数,IDCANCEL映射到CDialog::OnCancel()。

这两个函数的源码如下:
void CDialog::OnOK()
{
    if (!UpdateData(TRUE))
    {
        TRACE(traceAppMsg, 0, "UpdateData failed during dialog termination.\n"); 
     // the UpdateData routine will set focus to correct item
        return;
    }
    EndDialog(IDOK);
}

void CDialog::OnCancel()
{
    EndDialog(IDCANCEL);
}
可以看出点击这两个按钮,都会调用EndDialog()来关闭对话框,只是返回值不同。
EndDialog()函数调用了DestroyWindow()函数,DestroyWindow()函数又发送了WM_DESTROY消息,该消息的处理函数是OnDestroy(),对话框的生存期最后一个函数是PostNcDestroy()函数。

点那个叉叉呢,首先向对话框发送WM_CLOSE消息,由OnClose()函数处理,它调用DestroyWindow(),其后是和上面一样的路由。
可以看出点叉叉的时候绕过了OnOK()和OnCancel()。

 

小结一下:
1. 点“确定”(回车键)、“取消”(ESC键)时的关闭路由为
OnOK()或OnCancel() ---> EndDialog() ---> DestroyWindow() ---> OnDestroy() ---> PostNcDestroy()
2. 点“关闭”标题栏按钮的关闭路由为
OnClose()---> OnCancel() ---> EndDialog() ---> DestroyWindow() ---> OnDestroy() ---> PostNcDestroy()


注意,

上面提到的这些函数统统都是可以重载的,在重载时加入了你自己的代码后,应该调用父类CDialog同名的函数才能正确路由下去,否则就关不了对话框了。
举个例子,重载了关闭的小叉叉
void CAboutDlg::OnClose()
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    DoSomthing(0; // 执行自己的判断等等

    // CDialog::OnClose(); // 把向导生成的父类调用给注释了,这时就关不了对话框了。
}


补充,
点叉叉会发送WM_CLOSE消息,如果需要重载的话,应该在对话框的属性窗口中,选择WM_CLOSE消息来添加消息处理函数。
VS的IDE会自动添加如下三段:
1. xxx.h文件,类声明中加入OnClose()函数声明
   afx_msg void OnClose();
2. xxx.cpp文件,加入消息映射宏
   ON_WM_CLOSE() // 对于Windows标准消息,都是这种简短的格式。
3. xxx.cpp文件,加入函数体
   void CMyDlg::OnClose()
  {
      CDialog::OnClose();
  }

上述3处如果都正常的话,叉叉就映射到OnClose()了。
如果叉叉映射到OnCancel()个人觉得有两种可能,
第一、缺ON_WM_CLOSE()宏,却多个一个ON_BN_CLICKED(IDCLOSE, &CMyDlg::OnCancel)宏
第二、在OnClose()中调用了OnCancel()

发布了15 篇原创文章 · 获赞 20 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ZDT_zdh/article/details/103079834