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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaominggunchuqu/article/details/54669647

创建非模态对画框的过程:见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) 则没有窗口出来发送

展开阅读全文

没有更多推荐了,返回首页