1、Document/View是MFC進化為Application Framework的靈魂。在MFC中,可以把Document簡單想像成資料,MFC的CDocument已經負責處理資料的類。同時,CDocument搭配了另一個重要的類CView。
CView為了資料的表現(顯示)而設計的。就是如何将你處理的結果顯示出來(輸出到螢幕或者列印機)。除了負責顯示外,View還負責程式與使用者之間的交談接口。使用者對資料的編輯、修改都需要仰賴視窗上的滑鼠與鍵盤操作才得以完成,這些消息都将由View接受後通知Document。
Document/View的價值在于,這些MFC類已經把一個應用程式所需的“資料處理與顯示”的函數空殼都設計好了,這些函數都是虛函數,是以你可以也應該在派生類中改寫他們。有關檔案讀寫的操作在CDocument的Serialize函數中進行,有關畫面顯示的操作在CView的OnDraw或 OnPaint函數中進行。當我們為自己派生兩個類CMyDoc和CMyView時,隻要把心思花在CMyDoc::Serialize和 CMyView::OnDraw上,其他瑣事不用管,整個程式會運作的好好的。示例:
1)如果按下【File/Open】,Application Framework會激活對話框,讓你指定檔案名,然後調用CMyDoc::Serialize讀檔案。Application Framework還會調用CMyView::OnDraw,把資料顯示出來。
2)如果螢幕狀态改變,産生了WM_PAINT,FrameWork會自動調用你的CMyView::OnDraw,傳一個Display DC,讓你重新繪制視窗内容。
3)如果按下【File/Print..】,FrameWork會自動調用你CMyView::OnDraw,這次傳進去的是一個Printer DC,是以繪圖操作的輸出對象就變成了列印機。
2、多文檔的一個圖示
3、Document Template的意義
程式每打開一份檔案(資料),就産生三份對象:
1)一份Document對象
2)一份View對象
3)一份CMDIChildWnd對象(作為外框視窗)
這三份對象由一個所謂的Document Template對象來管理;讓這三份對象産生關系的關鍵在于CMultiDocTemplate:
如果程式支援不同的資料格式,則需要不同的Document Template:
CMultiDocTemplate的構造函數如下所示:
說明:CRuntimeClass
它就是“類别型錄網”連結清單中的元素類型,任何一個類隻要在聲明時使用DECLRAE_DYNCREATE或DECLARE_SERIAL宏,就會擁有一個靜态的CRuntimeClass内嵌對象。
7、字元串資源的7個字段值[1,P322]
每一個字元串都可以再程式中取得,通過調用CDocTemplate::GetDocString,并在第二個參數中指定索引(1~7),但最好還是以CDocTempalte所定義的七個常量來代替索引值:
是以你可以這麼做:
8、再述Document/View
Document是資料的體,View是資料的面,我們藉CDocument管理資料,藉Collections Classes(MFC中的一組專門用來處理資料的類)處理實際的資料,藉CView顯示資料,藉CDC,CGdiObject實際繪圖。
使用者對Document的任何編輯操作都必須通過Document Frame視窗,消息随後傳到CView。
9、滑鼠拖放(Drag and Drop)
當使用者從Shell中拖放一個檔案到程式A,Shell就配置一塊全局記憶體,填入被拖拽的檔案名稱(包含路徑),然後發出WM_DROPFILES傳到程式A的消息隊列,程式A取得此消息後,應該把記憶體的内容取出,再想辦法打開、讀檔案。
隻有具備WS_EX_ACCEPTFILES風格的視窗才有收到這一消息。是以在使用CreateWindowEx第一個參數應當指定WS_EX_ACCEPTFILES。
10、操作系統資料庫
在傳統的Windows程式中操作系統資料庫兩種方法:
1)寫一個.reg檔案,通過regedit.exe來注冊。
2)::RegCreateKey,::RegSetValue來直接編輯Registry。
MFC中則更簡單:
隻要調用RegisterShellFileTypes即可。
11、消息映射
每一個派生于CCmdTarget的類都可以有自己的Message Map 用于處理消息。首先在類聲明中加上DECLARE_MESSAGE_MAP();在.cpp使用BEGIN_MESSAGE_MAP,END_MESSAGE_MAP兩個宏,中間就是消息與函數對應關系表。
12、預設的菜單指令項及其處理程式[1,P332]。
13、CEditView是一個已具備文字編輯能力的類,它所使用的視窗是Windows的标準控件之一Edit,其SerializeRaw成員函數可以把Edit控件中的raw text(而不是“對象”所持有的資料)寫到檔案中。
參考
[1] 深入淺出MFC
[2] MFC Technical Notes
<a href="http://msdn.microsoft.com/en-us/library/h6h0eact%28VS.80%29.aspx">http://msdn.microsoft.com/en-us/library/h6h0eact%28VS.80%29.aspx</a>