MFC窗口关闭执行的顺序

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wgq837051/article/details/83801611
  1.  
    1.  

 

 

SDI窗口的关闭

 

在这种情况下,主窗口将被关闭。首先,关闭应用程序的文档对象。文档对象的虚拟函数OnCloseDocument调用时销毁了主窗口(Windows窗口和MFC窗口对象),同时也导致视、工具条窗口的销毁。主窗口销毁后,应用程序的主窗口对象为空,故发送WM_QUIT消息结束程序。

 

MDI主窗口的关闭

 

首先,关闭应用程序的所有文档对象。文档对象的OnCloseDocument函数关闭文档时,将销毁文档对象对应的文档边框窗口和它的视窗口。这样,所有的MDI子窗口(包括其子窗口视)被销毁,但应用程序的主窗口还在。接着,调用DestroyWindow成员函数销毁主窗口自身,DestroyWindow发现被销毁的是应用程序的主窗口,于是发送WM_QUIT消息结束程序。

 

MDI子窗口(文档边框窗口)的关闭

 

在这种情况下,被关闭的不是主窗口。判断与该文档边框窗口对应的文档对象是否还被其他一个或者多个文档边框窗口使用,如果是,则仅仅销毁该文档边框窗口(包括其子窗口视);否则,关闭文档,文档对象的OnCloseDocument将销毁该文档边框窗口(包括其子窗口视)。

展开阅读全文

MFC 关闭DOS 窗口程序崩溃

01-16

在程序中打开了一个DOS输出窗口,用于监控程序运行,关闭程序的主界面和DOS窗口会出现两种情况:rn1.先关闭 主MFC界面,程序关闭正常rn2.先关闭DOS窗口,程序就异常崩溃。rn我在主程序加入了destroywindow和wm_close 两种情况的处理,都没有执行到它们。rn请问如何处理先关闭DOS窗口的情况。rnrn程序错误时的提示信息如下:rnDebug Assertion Failed!rnProgram: C:\Windows\system32\mfc120ud.dllrnFile: f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpprnLine: 1065rn这个错误的源码为:rn[code=c]rnBOOL CWnd::DestroyWindow()rnrn CWnd* pWnd;rn CHandleMap* pMap;rn HWND hWndOrig;rn BOOL bResult;rn if ((m_hWnd == NULL) && (m_pCtrlSite == NULL))rn return FALSE;rn bResult = FALSE;rn pMap = NULL;rn pWnd = NULL;rn hWndOrig = NULL;rn if (m_hWnd != NULL)rn rn pMap = afxMapHWND();rn//1065 ENSURE(pMap != NULL);rn pWnd = (CWnd*)pMap->LookupPermanent(m_hWnd);rn#ifdef _DEBUGrn hWndOrig = m_hWnd;rn#endifrn rnrn if ((m_hWnd != NULL) || (m_pCtrlSite != NULL))rn rn if (m_pCtrlSite == NULL)rn bResult = ::DestroyWindow(m_hWnd);rn elsern bResult = m_pCtrlSite->DestroyControl();rn rnrn if (hWndOrig != NULL)rn rn // Note that 'this' may have been deleted at this point,rn // (but only if pWnd != NULL)rn if (pWnd != NULL)rn rn // Should have been detached by OnNcDestroyrn#ifdef _DEBUGrn ASSERT(pMap->LookupPermanent(hWndOrig) == NULL);rn#endifrn rn elsern rn#ifdef _DEBUGrn ASSERT(m_hWnd == hWndOrig);rn#endifrn // Detach after DestroyWindow called just in casern Detach();rn rn rnrn return bResult;rnrn[/code]rn[code=c]rn//打开DOS窗口rnvoid OpenConsole() rn rn AllocConsole();rn HANDLE console_handle = GetStdHandle(STD_OUTPUT_HANDLE);rn int hCrt = _open_osfhandle((long)console_handle, _O_TEXT);rn FILE * hf = _fdopen(hCrt, "w");rn *stdout = *hf;rn //关闭console rn //CloseHandle(console_handle);rn //FreeConsole();rnrnrn[/code] 论坛

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