可能是因為工作側重點的關係吧,以前沒有用過MDI介面的編程,最近需要編寫一個MDI程式,先拿《深入淺出MFC》看了兩天,
直接從第八章開始看,搞懂了View,Doc之間的關係。對MFC的理解又深了一層,發現微軟的編程架構,一直體現著歸納、複用和平台化的觀念,眼光不是一般的遠。
現在陸陸續續把遇到的一些小問題和解決方案總結一下,高手就不必看了,見笑了。
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
MFC自動添加的注釋已經說出了斷言發生的原因:需要有 WS_CHILD 標誌。
Release運行不會出現斷言錯誤,但無法顯示出對話方塊中的控制項。
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視窗的子視窗。