我想在沒有文檔/視圖體系結構的情況下使用MFC。沒有文檔/視圖體系結構的MFC
我創建沒有文檔/視圖支持一個項目時,Visual C++創建的CFrameWnd和從的CWnd繼承的圖。我將從CWnd繼承的視圖替換爲從繼承的新視圖CFormView。
但是,當我運行我的程序時,在關閉窗口後,出現堆損壞錯誤。
我想在沒有文檔/視圖體系結構的情況下使用MFC。沒有文檔/視圖體系結構的MFC
我創建沒有文檔/視圖支持一個項目時,Visual C++創建的CFrameWnd和從的CWnd繼承的圖。我將從CWnd繼承的視圖替換爲從繼承的新視圖CFormView。
但是,當我運行我的程序時,在關閉窗口後,出現堆損壞錯誤。
問題是MFC的生命週期管理。視圖聲明(由Visual C++嚮導創建)是:
CChildView m_wndView;
我取代上述代碼用:
CChildFormView m_wndView;
CChildView繼承的CWnd,CChildFormView從的CFormView繼承。這兩個視圖都是由嚮導創建的,但只有CChildFormView使用宏,因此IMPLEMENT_DYNCREATE宏使用DECLARE_DYNCREATE/。
由於m_wndView正在堆棧中創建,當MFC自動調用delete時,我得到錯誤。
我不明白如何將CChildView的名稱更改爲CChildFormView會更改應用程序的構建或執行方式,這些名稱是我們提供的名稱,而不是MFC類的名稱。我懷疑這與其他人有任何關聯。很多年前,我寫了一篇文章描述如何創建一個沒有文檔/視圖體系結構的MFC CFormView應用程序。這並不容易,至少不是那樣。 – user34660 2017-04-09 19:21:52
既然您想使用對話框編輯器,而您又不想使用文檔/視圖架構,那麼您可能需要一個「基於對話框」的應用程序。
如果在框架窗口處理WM_CREATE的地方,您更改代碼以創建具有AFX_IDW_PANE_FIRST的「魔術」ID的CFormView實例,您會發現它成爲框架窗口的視圖。這是由於CFrameWnd :: InitialUpdateFrame()的行爲,它將在MFC中調用。這個有用的小功能的MSDN頁面評論:
我不明白「從CWnd繼承的_view繼承自CFormView_的新視圖」。 – user34660 2017-04-09 19:15:19