解決:AppMsg - Warning: calling DestroyWindow in CWnd::~CWnd; OnDestroy or PostNcDestroy in derived class will not be called


類似的還有:AppMsg - Warning: Destroying non-NULL m_pMainWnd(這是因為你既沒有自己delete,也沒有調用DestroyWindow)

首先解決第一個,直接列代碼:

 1 class SCCApp : public CWinApp
 2 
 3 class CMainWindow : public CFrameWnd
 4 
 5 BOOL SCCApp::InitInstance()
 6 {
 7     m_pMainWnd = new CMainWindow;
 8     if (!::RegisterHotKey(m_pMainWnd->GetSafeHwnd(), 0x0001, NULL, VK_F1))
 9     {
10         ::MessageBox(NULL, _T("注冊F1熱鍵失敗!請關閉熱鍵沖突的程序並重啟本程序!"),
11             _T("錯誤"), MB_ICONERROR);
12         delete m_pMainWnd;
13         return FALSE;
14     }
15     m_pMainWnd->ShowWindow(m_nCmdShow);
16     m_pMainWnd->UpdateWindow();
17     return TRUE;
18 }

12行,你直接delete,但該window不會收到WM_DESTROY and WM_NCDESTROY消息,所以無法正確的銷毀,替換為:

m_pMainWnd->DestroyWindow();

不需要你手動寫delete,這是因為雖然CWnd的PostNcDestroy不會調用delete this,但CFrameWnd的PostNcDestroy會調用delete this。你調用完之后m_pMainWnd會變為NULL,你可以在下面加如下代碼驗證:

if (m_pMainWnd == NULL)
    std::ofstream os("NULL");

最開始我在m_pMainWnd->DestroyWindow()后面用delete m_pMainWnd來驗證發現沒有報錯,就是因為delete NULL沒有任何效果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM