MDI編程中出現的問題與解決方案

來源:互聯網
上載者:User
可能是因為工作側重點的關係吧,以前沒有用過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視窗的子視窗。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.