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