天天看點

23、深入淺出MFC學習筆記,MFC解剖(骨幹程式)相關

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、多文檔的一個圖示

23、深入淺出MFC學習筆記,MFC解剖(骨幹程式)相關

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>