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

/********************************/
第十五章:文檔與視圖的分離

1,SDI應用程序文檔類由CDocument類派生,一個文檔類可以有一個或多個由CView類派生的視圖類。
 
2,重要成員函數:
1)CView::GetDocument
CDocument* GetDocument( ) const;
//文檔對象是用來保存數據的,而視圖對象則是用來顯示數據的。
//一個視圖對象只有一個與之相關連的文檔對象。
//Return A pointer to the CDocument object associated with the view.Return NULL if the view is not attached to a document.
//Call this function to get a pointer to the view’s document. This allows you to call the document’s member functions.

2)CDocument::UpdateAllViews
void UpdateAllViews( CView* pSender, LPARAM lHint = 0L, CObject* pHint = NULL );
//當文檔數據發生修改的時候,調用該函數通知所有的視圖對所顯示的數據進行相應得更新。
//pSender:Points to the view that modified the document, or NULL if all views are to be updated.
//如果在派生文檔類中調用UpdateAllViews函數,則pSender應該設置爲NULL;如果UpdateAllViews函數在派生視圖類成員函數中調用,則pSender參數應該設置成this(如:GetDocument()->UpdateAllViews(this);)

3)CView::OnUpdate
virtual void OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint );
//當應用程序調用了CDocument::UpdateAllViews函數時,會調用OnUpdate函數更新視圖顯示。
//通常視圖類OnUpdate函數先對文檔進行訪問,讀取文檔的數據,然後對視圖的數據成員或控制進行更新,以反應文檔的變化。
//可以利用OnUpdate函數使視圖的某部分無效,以觸發視圖的OnDraw函數調用,從而利用文檔數據來重繪對應的視圖窗口。
//默認的OnUpdate函數使得整個窗口矩形無效。
//當程序調用CDocument::UpdateAllViews函數,如果pSender參數指向了某個特定的視圖對象,則除了該指定的視圖之外,文檔的所有其它視圖的OnUpdate函數都會被調用。

4)CView::OnInitialUpdate
virtual void OnInitialUpdate( );
//當應用程序被啓動,或當用戶從File菜單選擇了New時候,或當用戶從File菜單選擇了Open時候,該虛函數都會被自動調用。
//CView基類中的OnInitialUpdate函數除調用OnUpdate函數中沒做其它任何事情。如果在派生類中重載該函數一定要調用基類的OnInitialUpdate函數,或調用派生類的OnUpdate函數。
//當應用程序啓動時,框架調用視圖類的OnCreate函數之後立即調用OnInitialUpdate函數。OnCreate函數只能被調用一次,而OnInitialUpdate可以被調用多次。
//可以通過在派生重載OnInitialUpdate函數,在其中對視圖對象進行初始化。

5)CDocument::OnNewDocument
virtual BOOL OnNewDocument( );
//Called by the framework as part of the File New command. The default implementation of this function calls the DeleteContents member function to ensure that the document is empty and then marks the new document as clean. Override this function to initialize the data structure for a new document. You should call the base class version of this function from your override.
//If the user chooses the File New command in an SDI application, the framework uses this function to reinitialize the existing document, rather than creating a new one. If the user chooses File New in a multiple document interface (MDI) application, the framework creates a new document each time and then calls this function to initialize it. You must place your initialization code in this function instead of in the constructor for the File New command to be effective in SDI applications.


3,簡單文檔視圖交互應用程序步驟(單文檔單視圖):
1)在派生文檔類中定義文檔的數據成員,用以保存程序中數據。爲了方便派生視圖類的訪問可以將這些數據成員定義成公有類型或將派生視圖類定義爲派生文檔類的友元類。
2)在派生視圖類中對OnInitialUpdate虛成員函數進行重載。當文檔數據被初始化或被從磁盤中讀出後,框架會自動調用OnInittialUpdate函數。該函數對視圖進行更新,以便放映出當前的文檔數據。
3)在派生視圖類中,讓窗口消息控制函數和命令消息控制函數直接讀取和更新文檔數據成員,利用GetDocument函數對文檔對象進行訪問。

對應事件發生次序:
程序啓動: CMyDocument對象被創建-》CMyView對象被創建-》視圖窗口被創建-》CMyView::OnCreate函數被調用(如果被映射)-》CMyDocument::OnNewDocument函數被調用-》
CMyView::OnInitialUpdate函數被調用-》視圖對象被初始化-》視圖窗口無效-》CMyView:OnDraw函數被調用
用戶編輯數據: CMyView類中函數對CMyDocument數據成員進行更新
退出程序: CMyView對象被刪除-》CMyDocument對象被刪除


4,CFormView類
CFormView類具有許多無模式對話框的特點,其派生類也和相應的對話框資源相聯繫,也支持DDX和DDV等。
CFormView類對象可以直接接收來之本身的控制通告消息,也可接收來自框架窗口的命令消息。(同時具有許多無模式類對話框和視圖類特徵)。
派生層次:CView|CScrolView|CFromView
CFormView類雖然不是從CDialog類派生,但是圍繞對話框創建,因而可以使用許多CDialog類成員函數。(這時只需將CFormView指針強制轉換成CDialog類指針即可)如:((CDialog*)this)->GotoDlgCtrl(GetDlgItem(IDC_NAME));


5,高級文檔視圖交互應用程序步驟(單文檔多視圖):
編寫多視圖應用程序,只要對其中某一視圖編輯改變了文檔,則其它的文檔需要隨之更新,以反映出文檔的變化。
步驟:
1)在派生文檔類中定義需要的數據成員。同時設計訪問該數據成員的方法,或將視圖類設計成文檔類的友元類。
2)在派生視圖類中,利用嚮導重載OnUpdate虛成員函數。當文檔數據被修改後,應用程序框架會自動調用該函數。利用重載的OnUpdate函數來完成視圖的更新,以反映當前的文檔數據。
3)對所有的命令消息判斷其哪些是針對文檔的哪些是針對視圖的,然後將其映射到相應的類中。
4)在派生視圖類中,允許對文檔數據進行更改,在退出之前,一定要調用CDocument::UpdateAllViews函數更新其它的視圖。使用CView::GetDocument獲取相關聯的文檔對象指針。
5)在派生文檔類中,允許對文檔數據進行修改,修改後退出前要調用UpdateAllViews函數更新與其關聯的所有視圖。

對應發生的事件次序:
應用程序啓動:CMyDocument對象被創建-》CMyView對象被創建-》其它視圖對象被創建-》視圖窗口被創建-》CMyView::OnCreate函數被調用(如果被映射)-》CMyDocument::OnNewDocument函數被調用-》CMyView::OnInitialUpdate函數被調用-》調用CMyView::OnUpdate-》初始化視圖
用戶編輯數據: 視圖類中函數對CMyDocument數據成員進行更新
  退出時候調用CDocument::UpdateAllViews函數更新其它的視圖
退出程序: 視圖對象被刪除-》CMyDocument對象被刪除


6,筆記略過內容:診斷信息轉儲(參見P296-P300),CObList集合類(參見P308-312)
1)選擇Debug目標時_DEBUG常量候被定義,程序中的診斷代碼會被連到程序中去。
2)選擇Release目標,診斷信息轉儲被禁止,診斷代碼也不會被連到程序中去。由Release目標生成的可執行文件非常小(比使用Debug目標生成的目標文件小很多呢)。
3)CObList很重要的特性是可以包含混合指針。


///////////////////////////////////
/////////////////////////////////

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