動態創建視圖時候 AfxCheckDialogTemplate執行出錯
在mfc的sdi架構中,準備多做幾個視圖,試圖類繼承自formview,但在動態創建視圖的時候出了錯誤,AfxCheckDialogTemplate執行出錯。后來通過搜索發現cformview類關聯對話框時候,資源必須具備child屬性。
1.CFormView類關聯的對話框資源必須具有Child屬性。
由CFormView派生的類,可以關聯一個對話框資源。但該對話框資源必須在屬性設定中Style選定[Child]屬性,否則的話,
代碼可以編譯,但Debug運行會報告一個斷言錯誤,跟蹤代碼,斷言在:
#ifdef _DEBUG
// dialog template must exist and be invisible with WS_CHILD set
if (!_AfxCheckDialogTemplate(m_lpszTemplateName, TRUE))
{
ASSERT(FALSE); // invalid dialog template name
PostNcDestroy(); // cleanup if Create fails too soon
return FALSE;
}
#endif //_DEBUG
2.CFormView比較特殊,是一個父窗體嵌套了一個子窗體,所以,
CFormView類的派生類的實例不響應WM_CLOSE消息,僅僅響應WM_DESTROY消息。
另外,若要用代碼關閉當前View,也不能直接:PostMessage(WM_CLOSE,0,0);
而必須先獲取父窗體的指針,然后對父窗體發送WM_CLOSE消息才行,像這樣:
GetParent()->PostMessage(WM_CLOSE,0,0);
才能夠達到目的。
《深入淺出MFC》第八章461頁圖8-1清楚地說明了這種情況,View窗口是CChildFrame窗口的子窗口。