OnOK与OnCancel (转载) 2010-11-25 11:24

作者:小马

这几天调一个程序时,遇到一个和OnOK, OnCancel有关的bug, 于是整理一下写了下面这篇文章.

首先OnOK是对ID_OK的响应, OnCancel是对IDCANCEL的响应. 前者对应键盘的Enter, 后者对应Esc.

两个函数都是CDialog类的virtual的成员函数, 也就是MFC是希望你去重载它们. 两个函数有一个共同点,就是都会调用EndDialog. 当然是调用CDialog的EndDialog. 那么这个EndDialog做个什么事呢? 看看MSDN上怎么说.

下面这段是从MSDN上摘下来的:

Call this method to destroy a modal dialog box

Do not call EndDialog to destroy a modeless dialog box. Call CWindow::DestroyWindow instead

从这段英文可以获得两个信息, 一是有模式的对话框可以用EndDialog来销毁, 二是无模式的对话框要用DestroyWindow来销毁. 而这一点,MSDN在OnOK的函数说明了也做了强调,内容如下:

If you implement the OK button in a modeless dialog box, you must override the OnOK method and call DestroyWindow inside it. Do not call the base-class method, because it calls EndDialog which makes the dialog box invisible but does not destroy it.

为什么强调用谁来销毁,因为这牵涉到资源释放的问题. 比如当你的这个对话框是无模式的,你关闭对话框时,就不能只调用CDialog的OnOK, 还应该DestroyWindow,像下面这样:

void CMyDlg::OnOK(){ CDialog::OnOK();//第一步,关闭窗口 DestroyWindow();//第二步,释放资源}


最后,补充一个基础知识.

怎么判断对话框是有模式的还是无模式的呢,很简单,如果你的对话框是用DoModal生成,它就是有模式的,如果是用Create生成的,它就是无模式的. 假设现在你用VC新建一个基于对话框的应用, 这个默认生成的对话框就是一个有模式的对话框.


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/pony_maggie/archive/2010/01/29/5270535.aspx

问题虽小可是如果不仔细,会出现new出来dialog的对象没被释放,导致泄漏。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值