動(dòng)態(tài)創(chuàng)建視圖時(shí)候 AfxCheckDialogTemplate執(zhí)行出錯(cuò)
在mfc的sdi架構(gòu)中,準(zhǔn)備多做幾個(gè)視圖,試圖類繼承自formview,但在動(dòng)態(tài)創(chuàng)建視圖的時(shí)候出了錯(cuò)誤,AfxCheckDialogTemplate執(zhí)行出錯(cuò)。后來通過搜索發(fā)現(xiàn)cformview類關(guān)聯(lián)對話框時(shí)候,資源必須具備child屬性。
1.CFormView類關(guān)聯(lián)的對話框資源必須具有Child屬性。
由CFormView派生的類,可以關(guān)聯(lián)一個(gè)對話框資源。但該對話框資源必須在屬性設(shè)定中Style選定[Child]屬性,否則的話,
代碼可以編譯,但Debug運(yùn)行會(huì)報(bào)告一個(gè)斷言錯(cuò)誤,跟蹤代碼,斷言在:
#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比較特殊,是一個(gè)父窗體嵌套了一個(gè)子窗體,所以,
CFormView類的派生類的實(shí)例不響應(yīng)WM_CLOSE消息,僅僅響應(yīng)WM_DESTROY消息。
另外,若要用代碼關(guān)閉當(dāng)前View,也不能直接:PostMessage(WM_CLOSE,0,0);
而必須先獲取父窗體的指針,然后對父窗體發(fā)送WM_CLOSE消息才行,像這樣:
GetParent()->PostMessage(WM_CLOSE,0,0);
才能夠達(dá)到目的。
《深入淺出MFC》第八章461頁圖8-1清楚地說明了這種情況,View窗口是CChildFrame窗口的子窗口。
posted on 2013-05-31 17:02
王海光 閱讀(2026)
評論(0) 編輯 收藏 引用 所屬分類:
MFC