MFC模态窗口与非模态窗口之差异、及其兼容类

35 篇文章 0 订阅

MFC窗口分为“模态窗口”和“非模态窗口“”。两种窗口的调用方法不同,关闭时的处理也不相同。

MFC默认生成的窗口类框架,只适合于模态窗口。

如果以非模态窗口显示,在关闭非模态窗口时,窗口并没有真正销毁,只是隐藏了窗口,还可以用ShowWindow()恢复,不会执行析构函数,分配的内存不释放。如果频繁使用非模态窗口,造成可用内存越来越少。

一、显示窗口

模态窗口显示过程如下:

_C_MyDlg c_Dlg;
c_Dlg.DoModal();

主程序在原地等待模态窗口退出,然后才能继续执行。

非模态窗口显示过程如下:

_C_MyDlg *pc_Dlg = new _C_MyDlg(this);
pc_Dlg->Create(IDD_MYDLG, this);
pc_Dlg->ShowWindow(SW_SHOW);

非模态窗口显示后,主程序继续执行。

二、关闭窗口

右上角关闭按键“×”会触发OnClose()事件,可以重载OnClose()函数,在其中处理关闭事务。

模态窗口与非模态窗口关闭时,差异如下:

1.  如果没有重载OnCancel()或OnBnClickedCancel(),窗口为模态时,OnClose()会销毁窗口;窗口为非模态时,OnClose()不会销毁窗口,窗口界面只是隐藏,可使用ShowWindow(SW_SHOW)恢复。

2. 如果重载了OnCancel()或OnBnClickedCancel(),则OnClose()不会销毁窗口,OnClose()执行完后,触发OnCancel()事件或OnBnClickedCancel()事件。

3. 在重载的OnCancel()或OnBnClickedCancel()中,窗口为模态时,OnCancel()会销毁窗口;窗口为非模态时,OnCancel()不会销毁窗口,窗口界面只是隐藏,可使用ShowWindow(SW_SHOW)恢复。

所以,如果重载了OnCancel()或OnBnClickedCancel(),通常不需要重载OnClose()。

真正销毁非模态窗口的步骤:

1. 在重载OnClose()或OnCancel()或OnBnClickedCancel()中添加:

this->DestroyWindow();

2. 重载PostNcDestroy(),在其中添加:

delete this;

如果窗口类要同时兼容两种窗口类型,则在关闭窗口时,要判断窗口类型,并对非模态窗口关闭做上述处理(略有差异)。

详见:工程实例下载

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值