MFC要求用户程序中窗口类要从CWnd继承。

class CMyDlg:public CWnd{
protected:
HCURSOR m_hCursorArrow;
public:
CMyDlg();
protected:
virtual void PostNcDestroy();
};
一般一定要重载虚函数PostNcDestroy,用于释放动态创建的窗口子类对象 delete this。
下面是CMyDlg的实现
CMyDlg::CMyDlg()
{
m_hCursorArrow = AfxGetApp()->LoadCursor(IDC_ARROW);
LPCTSTR lpszClassName = AfxRegisterWndClass(0,NULL,
(HBRUSH)(COLOR_3DFACE+1),AfxGetApp()->LoadCursor(IDI_APPLICATION));

CreateEx(0,lpszClassName,"用MFC创建的简单窗口",
WS_OVERLAPPED|WS_SYSMENU|WS_CAPTION|WS_MAXIMIZEBOX,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL);
//::MessageBox(NULL, "run at CMyDlg::CMyDlg()", "提示", MB_OK);
}
void CMyDlg::PostNcDestroy()
{
::MessageBox(NULL, "run at CMyDlg::PostNcDestroy()", "提示", MB_OK);
delete this;
}
我为了观察PostNcDestroy的调用情况,在CMyDlg::PostNcDestroy()加入了一个显示提示框的代码。
现在的问题是程序运行后提示框根本没有显示(通过调试发现程序是进入了改函数的),而在其他函数中的提示框是可以显示的,这是什么原因呢?
另外
关闭窗口时MFC是怎样最终关联到CMyDlg::PostNcDestroy()这个函数的呢?
这里没有做消息映射,我想应该是直接采用了基类方的映射机制,关联到了基类的PostNcDestroy()函数,而PostNcDestroy是虚函数,所以最终关联到了CMyDlg::PostNcDestroy,不知道这种猜想是否正确。MFC PostNcDestroy

解决方案 »

  1.   

    关闭窗口时MFC是怎样最终关联到CMyDlg::PostNcDestroy()这个函数的呢?研究了一下,CWnd类中对WM_NCDESTROY消息进行了映射,映射函数为On_NcDestroy, 在这个函数中调用了PostNcDestroy, PostNcDestroy是虚函数,所以实践执行子类的PostNcDestroy, 其作用是用于删除动态创建的窗口对象,用 delete this;
      

  2.   

    用AfxMessageBox关闭窗口时MFC是怎样最终关联到CMyDlg::PostNcDestroy()这个函数的呢?
    虚函数调用机制
      

  3.   

    改成 void CMyDlg::PostNcDestroy()
    {
    AfxMessageBox("run at CMyDlg::PostNcDestroy()", MB_OK);
    delete this;
    }
    还是不能显示提示框。
      

  4.   

     
    我仅有一个窗口,直接显示的。BOOL CMyApp::InitApplication()
    {
    //::MessageBox(NULL, "run at CMyApp::InitApplication()", "提示", MB_OK);
    m_pMainWnd = new CMyDlg;
    m_pMainWnd->ShowWindow(m_nCmdShow);
    m_pMainWnd->UpdateWindow();
    return TRUE;
    }