文檔的讀過程
在向導創(chuàng)建的應用程序中,程序的默認菜單有"文件"、"編輯"、"視圖"和"幫助"。當運行程序后,打開"文件"菜單中的"打開"命令時,應用程序會自動打開相應的"打開"文件通用對話框。之所以有這功能,是因為向導創(chuàng)建的應用程序框架中,自動將"打開"菜單命令與CWinApp的OnFileOpen成員函數(shù)相關聯(lián)。這種關聯(lián)是通過"消息映射"來實現(xiàn)的,在CTextViewerApp類的實現(xiàn)文件TextViewer.cpp前面有這樣的代碼,如圖2所示。
圖2 應用程序類的消息映射
"消息映射"是MFC中的一個亮點。在Windows操作環(huán)境中,無論是系統(tǒng)產生的動作或是用戶運行應用程序產生的動作,都稱為事件(Events)產生的消息(Message)。例如,用戶選擇菜單時所產生的消息稱為"命令"消息,而鼠標改變窗口狀態(tài)時所產生的消息是"窗口"消息。只要是消息,都可以通過MFC的"消息機制"來映射。映射的目的是將消息和某個函數(shù)相關聯(lián),這樣一旦該消息產生就會執(zhí)行相關聯(lián)的函數(shù)。
圖2代碼中,BEGIN_MESSAGE_MAP和END_MESSAGE_MAP是MFC開始和結束消息映射宏,ON_COMMAND是專門用來映射像菜單的一些命令消息宏,它有兩個參數(shù),第一個參數(shù)用來指定命令標識,MFC中每個菜單項都有一個標識值,"打開"菜單的標識ID為ID_FILE_OPEN,第二個參數(shù)是用來指定關聯(lián)的函數(shù)。(消息映射以后還會講到)
當用戶在通用"打開"文件對話框中指定一個文件后,應用程序將調用文檔對象的 CDocument::OnOpenDocument虛成員函數(shù)。該函數(shù)將打開文件,并調用DeleteContents清除文檔對象的內容,然后創(chuàng)建一個CArchive(歸檔類)對象用于數(shù)據的讀取,接著又自動調用Serialize函數(shù)。之后便調用視圖對象的CView::OnInitialUpdate虛成員函數(shù)。
在這個過程中,我們可能有很多地方不理解。但我們仔細想一想就會明白許多。假如視圖中已有文檔數(shù)據顯示,為了能快速顯示和修改這些數(shù)據,顯然這些數(shù)據要存儲在專門的內存空間中,CArchive類對象就起到了這個作用。當打開另一個文檔時,以前在內存中存儲的數(shù)據要清除,這就是DeleteContents作用,而且還要使視圖能及時更新顯示,所以要調用OnInitialUpdate函數(shù)。
上述的Serialize函數(shù)是一個很特別的函數(shù),它既可以從中讀取文檔數(shù)據,也可以保存文檔數(shù)據,稱為"序列化"函數(shù)。它被添加用戶的文檔類中,用來根據CArchive內部的一個標志來決定文檔數(shù)據的流向(讀或寫),如圖3所示。
圖3 Serialize函數(shù)代碼