解决: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没有任何效果。