您的位置:首页 > 其它

非模态对话框的创建和销毁过程

2017-01-22 17:09 344 查看
创建非模态对画框的过程:见http://blog.csdn.net/xiaominggunchuqu/article/details/49895325
 
一个非模态的MFC
窗口的销毁过程:
假设自己通过new创建了一个窗口对象pWnd,然后pWnd->Create。则销毁窗口的调用次序:
1.      手工调用pWnd->DestroyWindow(); //
一般在对话框类中的OnCancle函数中postMessage(WM_DESTORY)或者直接调用
2.       DestroyWindow会发送WM_DESTROY;
3.       WM_DESTROY对应的消息处理函数是OnDestroy();
4.       DestroyWindow会发送WM_NCDESTROY;
5.       WM_NCDESTROY对应的消息处理函数是OnNcDestroy;
6.       OnNcDestroy最后会调用PostNcDestroy;
7.       PostNcDestroy经常被用户重载以提供释放内存操作。例如可以使用delete this;

通过这种方式,窗口对象对应的窗口和窗口对象本身都被释放了。

对于非模态窗口,必须重载OnCancel函数,在函数中调用DestroyWindows()方法,且不能调用基类的函数。因为基类函数中调用的是EndDialog()方法。(因为EndDialog是关闭模态对话框时调用的)而OnClose()也会调用OnCancel()方法。另外想通过OnOK关闭对话框,也必须同样处理,不能直接用默认方法。

所以对于非模态窗口,其关闭过程为:

OnClose()->OnCancel()->DestroyWindow()->OnDestroy()->OnNcDestroy()->PostNcDestroy()->仅表示时间先后而已

而OnNcDestroy()最后又调用了PostNcDestroy()
 

对于DoModal出来的窗口,可以使用默认的OnOk()和OnCancel()来处理。其基类方法中会调用EndDialog()方法。
 

最后注意一个问题,通常我们创建一个非模态窗口时,可能会这样写

{

   CDialog * pWnd = new CMyDialog();

   pWnd->Create(……);

   pWnd->ShowWindow(SW_SHOW);

}

   一般是在一个模块或者一个函数中创建窗口,但是却无法知道什么时候关闭窗口。而pWnd也只是作为一个局部变量。那么如何对它进行析构呢?

通常这样是重载虚函数PostNcDestroy()来实现

void CMyDialog::PostNcDestroy()

{

       CDialog::PostNcDestroy();

       delete this;

}

 为什么把对话框类的delete this放在PostNcDestroy中而不是OnNcDestroy

   这是因为OnNcDestroy只被已建立的窗口调用。如果建立窗口失败(如PreCreateWindow),
则没有窗口出来发送
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: