深入理解OnOK与OnCancel

来源:互联网 发布:宁武子 邦有道则知 编辑:程序博客网 时间:2024/06/05 02:43

转载请注明出处

作者:小马


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


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

 

两个函数都是CDialog类的virtual的成员函数也就是MFC是希望你去重载它们两个函数有一个共同点,就是都会调用EndDialog. 当然是调用CDialogEndDialog. 那么这个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来销毁而这一点,MSDNOnOK的函数说明了也做了强调,内容如下:


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.


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

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

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

 

原创粉丝点击