VC对话框的关闭按钮 调用函数的过程

本文详细解释了Windows对话框中OK/CANCEL按钮的默认行为,以及如何重载OnOK和OnCancel函数,以及自定义关闭小叉叉的处理过程。重点展示了EndDialog()和DestroyWindow()在关闭流程中的作用,以及如何避免影响对话框的正常关闭。
摘要由CSDN通过智能技术生成

VC对话框的关闭按钮 调用函数的过程
在这里插入图片描述

对话框默认用的两个按钮的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. 点“确定”、“取消”时的关闭路由为
    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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值