非模态对话框的创建和销毁过程
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),
则没有窗口出来发送
一个非模态的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),
则没有窗口出来发送
相关文章推荐
- 模态和非模态对话框的创建于销毁过程
- 非模态对话框 模态对话框 --创建和销毁过程
- 非模态对话框 模态对话框 --创建和销毁过程
- 模态和非模态对话框的创建与销毁过程
- MFC 创建非模态对话框和销毁过程
- VC中非模态对话框相对于模态对话框的创建和销毁过程
- 非模态对话框相对于模态对话框,他的创建和销毁过程和模态对话框有一定的区别
- 非模态对话框的创建与销毁
- 窗口创建和销毁过程
- 非模态对话框的创建于销毁
- 创建和销毁过程几个函数的执行顺序
- VC非模态对话框创建和销毁
- MFC之模态与非模态对话框的创建与销毁
- MFC应用程序消息处理及其窗口创建和销毁过程函数调用顺序
- 再谈非模态对话框的销毁 / 对话框建立过程/ 对话框销毁过程/ 消息传递过程
- 非模态对话框的创建与销毁
- MFC模态与非模态对话框的创建与销毁
- VC非模态对话框创建和销毁
- 创建和销毁过程几个函数的执行顺序
- 091017(星期六)非模态对话框的消息控制2创建销毁