非模态对话框的创建和删除

1、模式对话框:

在模式对话框下,用CDialog::OnOK()或CDialog::OnCancel()以及CDialog::OnClose()关闭对话框。

一定要注意之前的CDialog::(当然,你可以重载你自己对话框的这个虚函数,但是,后面必须调用基类的CDialog::)具体我们再参照深入浅出的风格,来个解刨。

CDialog::Close()默认调用CDialog::OnCancel() , CDialog::OnCancel()调用CDialog::EndDialog(IDCANCEL);

CDialog::EndDialog调用CDialog::DestroyWindows(),CDialog::DestroyWindows调用CDialog::OnDestroy() ;

CDialog::OnOK()默认先CDialog::UpdateData(),然后再调用CDialog::EndDialog(IDOK).

CDialog::EndDialog调用CDialog::DestroyWindows(), CDialog::DestroyWindows调用CDialog::OnDestroy()

看来上面你可能就知道了如下的等式

CDialog::Close() == CDialog::OnCancel() ==CDialog::EndDialog(IDCANCEL)一样。

CDialog::OnOK() == CDialog::EndDialog(IDOK).

而CDialog::EndDialog(IDOK)跟CDialog::EndDialog(IDCANCEL)的区别就是,少了一个CDialog::UpdateData(),也就是CDialog::EndDialog(IDOK),在关闭对话框后,会把对话框上控件关联的变量的值更新为用户最后输入的值。而CDialog::EndDialog(IDCANCEL)就不会更新这个值。

2、非模态对话框:

在非模式对话框,重载你自己的OnOK(),就是CMyDialog::OnOK()调用CDialog::DestroyWindows()。注意:不是默认的CDialog::OnOK()来关闭对话框。

重载CMyDialog::OnCancel()调用CDialog::DestroyWindows()。注意:不是调用默认的CDialog::OnCancel(),来关闭对话框。

听起来很简单,但是下面提到一个很具体的编程问题。

一般,我们用非模态对话框都是全局的,也就是通过new来创建,是在heap上的,而不是在stack上的。

这样我们当然还要通过delete 来销毁对象,不然可是有内存泄漏的。那么我们什么时候delete这个对象呢?

在msdn上面我们可以看到微软提供的方法是,

我们要重载PostNcDestroy(),即我们要实现CMyDialog::PostNcDestroy(),内容如下

CMyDialog::PostNcDestroy() { CDialog::PostNcDestroy(); deletethis; }

具体操作代码:

MotusTest *mMotusTest;

mMotusTest = new MotusTest();
mMotusTest->Create(IDD_DLGTEST, this);
mMotusTest->ShowWindow(SW_SHOW);

重载函数OnCancel()和函数OnOK()

void MotusTest::OnOK()
{
// TODO:  在此添加专用代码和/或调用基类
CDialogEx::DestroyWindow();
}
void MotusTest::OnCancel()
{
// TODO:  在此添加专用代码和/或调用基类
CDialogEx::DestroyWindow();
}

重载函数PostNcDestroy()

void MotusTest::PostNcDestroy()
{
// TODO:  在此添加专用代码和/或调用基类
CDialogEx::PostNcDestroy();

delete this;

}

函数EndDialog()和DestroyWindow()的区别。

(1) EndDialog(0);
关闭模态对话框,并且将参数作为父对话框调用的返回值。

(2)  DestroyWindow();

DestroyWindow 关闭非模态对话框。 退出消息循环,真正结束进程。有不少程序窗口关闭,但是不等于退出运行。

函数PostNcDestroy()

在窗口被销毁以后,缺省的OnNcDestroy成员函数调用这个函数。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值