VC++技術內幕(第四版)筆記(第17章)

/*************************************/

第十七章:讀和寫文檔--MDI應用程序


1, MFC庫中CMDIFrameWnd類封裝了主框架窗口和MDI客戶窗口所有的函數(包含了所有Windows MDI消息的消息控制函數),因而完全可以管理它的子窗口(由CMDIChildWnd類對象來表示的)。

2,MDI應用程序中,任何時候只有一個子窗口處於活動狀態。MDI應用程序只有以個 菜單和工具欄,其上的所有的命令都被傳遞到當前活動子窗口中。主窗口的標題欄中顯示活動窗口的文檔文件名。

3,MDI應用程序在啓動次序上和SDI程序大部分相同。MDI中被派生類中重載的InitInstance函數與SDI有所不同。(具體的不同跟蹤下代碼或見362頁啊,我就不抄了)

4,MDI應用程序實質:一個MDI應用程序可以使用多個文檔類型,並允許同時存在不止一個的文檔對象。
比較:
SDI中:
 CSingleDocTemplate* pDocTemplate;
 pDocTemplate = new CSingleDocTemplate(
  IDR_MAINFRAME,
  RUNTIME_CLASS(CStudentDoc),
  RUNTIME_CLASS(CMainFrame),       // main SDI frame window
  RUNTIME_CLASS(CStudentView));
 AddDocTemplate(pDocTemplate);

MDI中:
 CMultiDocTemplate* pDocTemplate;
 pDocTemplate = new CMultiDocTemplate(
  IDR_EX17ATYPE,
  RUNTIME_CLASS(CStudentDoc),
  RUNTIME_CLASS(CChildFrame), // custom MDI child frame
  RUNTIME_CLASS(CStudentView));
 AddDocTemplate(pDocTemplate);
//MDI中AddDocTemplate(pDocTemplate)的調用使得MDI應用程序能夠支持多個子窗口,而每個子窗口都與一個文檔對象和一個視圖對象相連接。若干個子窗口(及其相應的視圖對象)也可能與一個文檔對象相連接。
//MDI動態的創建CChildFrame對象。

5,SDI只能有一個框架窗口類和一個框架窗口對象(CMainFrame:CFrameWnd);MDI應用程序有兩個框架窗口類,並且可以有多個框架對象,即:
CMainFrame:CMDIFrameWnd  只有一個對應對象        有菜單和控制欄   無視圖
CChildFrame:CMDIChildWnd 每個子窗口對應一個對象  無菜單和控制欄   有視圖
對象的創建:CMainFrame對象在應用程序類的InitInstance函數中(即CMainFrame* pMainFrame = new CMainFrame;);CChildFrame對象是當新的子窗口被打開時,由應用程序框架來創建(MDI中InitInstance函數中ProcessShellCommand的調用用以創建子框架)。

6,MDI的InitInstance函數將CWinApp::m_pMainWnd設置成指向應用程序的主框架窗口指針。因而任何時候可以通過AfxGetApp函數來訪問m_pMainWnd。

7,一個MDI程序包含兩個獨立的字符串資源,分別由IDR_MAINFRAME和IDR_EX17ATYPE(視具體的項目變化)來標識的。(詳細見P361-362)

8,創建新文檔 和 爲現有的文檔創建新視圖(參見362頁,很多條款也不抄了)

9,MDI應用程序每次當文檔文件從磁盤中載入的時候,都會構造新的文檔對象,並且當子窗口被關閉的時候,相應的文檔對象被刪除。(問題:如果多個子窗口與同一個文檔對象相連接,那當一個子窗口被關閉,關聯的文檔對象會不會同時被刪除呢?)

10,SDI中不支持多次AddDocTemplate調用(SDI中在應用程序生存週期內,文檔對象、視圖對象、框架對象只被創建一次),而MDI中卻是通過多次調用AddDocTemplate來支持多個文檔模板,每個模板可制定不同的文檔類、視圖類以及MDI子框架類的組合。


(注:本章筆記有點粗糙,實例也只看了看沒跟蹤多少代碼,以後找個好實例再補上,時間關係,筆記暫停了些時日,見諒哦)
/////////////////////////

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章