VC编程中关于新建的框架窗口的销毁的一个心得
2009-05-14 22:07
363 查看
因为要做一个项目,其中一个需求是动态新建一个单文档框架窗口和视图窗口。大致清楚单文档窗口的构建需要新的框架类调用LoadFrame函数来触发。新建并显示窗口并不是大问题,在程序退出时释放框架窗口的相关内存的释放出现了一些问题。
代码实现过程大致是这样的:
首先在应用程序类里定义一个框架类指针:
新建框架窗口的相关代码:
最后在应用程序类的ExitInstance()函数对框架窗口进行销毁:
编译通过,开始运行。先运行主框架,然后新建一个框架窗口,然后关闭新建的框架窗口,再退出主程序就出现下面的错误:
经过发现,错误是在CNewFrameApp::ExitInstance()函数的m_pOpenglFrame->DestroyWindow()这一句触发的。
我分析,在关闭新建的框架窗口后新建的框架窗口的窗口句柄已经无效,但是其值并非为NULL,使用NULL!=hWnd来判断窗口句柄是否有效并不准确,我要做的是找到一种准确判断窗口句柄是否有效的办法。于是我把代码改为:
测试后问题解决,程序可以顺利退出也没有内存泄露。值得一提的是单击新建框架窗口的关闭按钮这时框窗口的相关内存的释放是由它的父类CFrameWnd的PostNcDestroy函数完成:
代码实现过程大致是这样的:
首先在应用程序类里定义一个框架类指针:
COpenglFrame *m_pOpenglFrame;// COpenglFrame继承自CFrameWnd类
新建框架窗口的相关代码:
CNewFrameApp* pApp = ( CNewFrameApp* )AfxGetApp(); pApp->m_pOpenglFrame = new COpenglFrame; CCreateContext Context; Context.m_pNewViewClass = RUNTIME_CLASS(COpenglView); pApp->m_pOpenglFrame->LoadFrame(IDR_MENU1,WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,NULL,&Context); pApp->m_pOpenglFrame->ShowWindow(SW_SHOW);
最后在应用程序类的ExitInstance()函数对框架窗口进行销毁:
int CNewFrameApp::ExitInstance() { // TODO: 在此添加专用代码和/或调用基类 HWND hWnd = NULL; if (NULL!=m_pOpenglFrame) { hWnd = m_pOpenglFrame->GetSafeHwnd(); if (NULL!=hWnd) { m_pOpenglFrame->DestroyWindow(); } } return CWinApp::ExitInstance(); }
编译通过,开始运行。先运行主框架,然后新建一个框架窗口,然后关闭新建的框架窗口,再退出主程序就出现下面的错误:
经过发现,错误是在CNewFrameApp::ExitInstance()函数的m_pOpenglFrame->DestroyWindow()这一句触发的。
我分析,在关闭新建的框架窗口后新建的框架窗口的窗口句柄已经无效,但是其值并非为NULL,使用NULL!=hWnd来判断窗口句柄是否有效并不准确,我要做的是找到一种准确判断窗口句柄是否有效的办法。于是我把代码改为:
int CNewFrameApp::ExitInstance() { // TODO: 在此添加专用代码和/或调用基类 HWND hWnd = NULL; if (NULL!=m_pOpenglFrame) { hWnd = m_pOpenglFrame->GetSafeHwnd(); if(IsWindow(hWnd)) { m_pOpenglFrame->DestroyWindow(); } } return CWinApp::ExitInstance(); }
测试后问题解决,程序可以顺利退出也没有内存泄露。值得一提的是单击新建框架窗口的关闭按钮这时框窗口的相关内存的释放是由它的父类CFrameWnd的PostNcDestroy函数完成:
void CFrameWnd::PostNcDestroy() { // default for frame windows is to allocate them on the heap // the default post-cleanup is to 'delete this'. // never explicitly call 'delete' on a CFrameWnd, use DestroyWindow instead delete this; }
相关文章推荐
- VC编程中关于新建的框架窗口的销毁的一个心得
- VC编程中关于新建的框架窗口的销毁的一个心得
- 关于在VC上搭建一个整体系统和应用的过程和心得
- 关于mapinfo和VC编程的一个源码
- 【VC++游戏开发】用C++来架构一个适合windows游戏编程的框架——取名为BCF
- vc关于窗口框架和状态栏的知识
- 【VC++游戏开发#十一】用C++来架构一个适合windows游戏编程的框架——取名为BCF
- 积累的VC编程小技巧之框架窗口及其他
- 在MDI主框架窗口中添加位图(转载自CSDN VC编程知识总结)
- VC编程小技巧之框架窗口及其他
- VC/MFC中窗口创建和销毁以及MFC应用程序框架
- 关于对于一个新框架的学习心得
- VC编程小技巧之框架窗口及其他
- 【VC编程】笔记1--创建一个Win32的应用程序,并显示创建的窗口和菜单
- 【VC++游戏开发】用C++来架构一个适合windows游戏编程的框架——取名为BCF
- VC++中关于ListControl排序的一点心得[原创]
- 现在想起来,一个最早学习编程的时候的问题, 关于文本文件的读写
- 关于Volly框架使用的心得(1)
- 关于Cocoa的窗口创建调用-一个nib包含两个窗口
- VC关于置顶窗口的方法小结