Visual C++應(yīng)用框架揭密
發(fā)表時(shí)間:2023-08-22 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]北京理工大學(xué)光電工程系 盧英威Visual C++應(yīng)用框架提供的強(qiáng)大功能,為我們的程序開發(fā)提供了極大的方便,利用其應(yīng)用生成器可以很輕松地生成應(yīng)用程序的框架.許多常用功能,例如文檔的創(chuàng)建,文件的打開,...
北京理工大學(xué)光電工程系 盧英威
Visual C++應(yīng)用框架提供的強(qiáng)大功能,為我們的程序開發(fā)提供了極大的方便,利用其應(yīng)用生成器可以很輕松地生成應(yīng)用程序的框架.許多常用功能,例如文檔的創(chuàng)建,文件的打開,保存等操作的大部分代碼都由應(yīng)用框架來完成.這些操作對(duì)于開發(fā)軟件的用戶而言,是透明的. Microsoft公司的設(shè)計(jì)Visual C++的初衷是盡量向用戶提供盡可能簡(jiǎn)單的接口,但是,正是因?yàn)閼?yīng)用框架的這一透明性,使Visual C++的運(yùn)行流程顯得非常神秘,當(dāng)涉及這些Visual C++已經(jīng)提供的功能模塊的軟件開發(fā)時(shí),用戶(特別是那些剛剛接觸Visual C++的)不知道什么時(shí)候該使用什么接口函數(shù),想改變Visual C++的一些默認(rèn)操作時(shí)也不知道該從哪兒下手,使開發(fā)的難度增加.
本人在編程實(shí)踐中發(fā)現(xiàn),可以通過Visual C++自帶的強(qiáng)大的Debug調(diào)試工具,跟蹤應(yīng)用框架代碼,從而得出應(yīng)用框架操作的部分流程.具體實(shí)現(xiàn)是:利用Visual C++應(yīng)用生成器生成應(yīng)用框架代碼,啟動(dòng) Classwizard,在各個(gè)類中加入欲跟蹤的接口函數(shù),編輯接口函數(shù),設(shè)置斷點(diǎn),再啟動(dòng)Debug進(jìn)行單步跟蹤調(diào)試.利用這一方法,我們還可以跟蹤 Visual C++提供的例子代碼.在跟蹤過程中,Visual C++的核心代碼是禁止跟蹤調(diào)試的,我們只要跳過就行.
以下是本人對(duì)多文檔應(yīng)用程序的文檔創(chuàng)建,文件的打開, 保存(另存為)操作的跟蹤結(jié)果,單文檔應(yīng)用與多文檔應(yīng)用的操作流程基本相似,只是用CSingleDocTemplate類的同名函數(shù)來替代對(duì) CMultiDocTemplate類同名函數(shù)的調(diào)用.以下說明中,"應(yīng)用程序"均指用戶生成的基于應(yīng)用框架的實(shí)際程序,"用戶代碼"指用戶在接口函數(shù)中加入的代碼.
一.創(chuàng)建文檔
ON_COMMAND(ID_FILE_NEW,CWinApp::OnFileNew)
入口:CWinApp::OnFileNew
調(diào)用:CdocManager::OnFileNew()
1.判斷有無文檔模板,無則函數(shù)返回;
2.判斷是否有多個(gè)文檔模板,如有則啟動(dòng)文檔模板選擇對(duì)話框, 讓用戶選擇一個(gè)模板后,返回模板指針.
3.由模板指針訪問CMultiDocTemplate::OpenDocumentFile()
31.創(chuàng)建新文檔對(duì)象
32.創(chuàng)建與新文檔對(duì)象對(duì)應(yīng)的子框架,構(gòu)筑子框架,文檔和視窗之間的關(guān)系
33.調(diào)用應(yīng)用程序的OnNewDocument()
a.調(diào)用CDocument::OnNewDocument()
調(diào)用應(yīng)用程序的DeleteContents();
b.用戶代碼
34.調(diào)用InitialUpdateFrame()顯示視窗
35.返回文檔指針
4.返回
二.打開文檔
ON_COMMAND(ID_FILE_OPEN,CWinApp::OnFileOpen)
入口:CWinApp::OnFileOpen
調(diào)用:CDocManager::OnFileOpen()
1.彈出對(duì)話框讓用戶選擇待打開的文件,返回該文件的全路徑名稱, 供下面函數(shù)調(diào)用時(shí)使用.
2.調(diào)用應(yīng)用程序的OpenDocumentFile(LPCTSTR lpszFileName)
21.用戶代碼
22.調(diào)用CWinApp::OpenDocumentFile(lpszFileName),
調(diào)用CWinApp::OpenDocumentFile(lpszFileName),
調(diào)用CDocManager::OpenDocumentFile
a.判斷有無該文件的打開文檔對(duì)象,有則激活該窗口并返回
b.調(diào)用CMultiDocTemplate::OpenDocumentFile()
b1.創(chuàng)建新的文檔對(duì)象,創(chuàng)建新文檔對(duì)象對(duì)應(yīng)的子框架
b2.調(diào)用應(yīng)用程序的OnOpenDocument()
(1)調(diào)用CDocument::OnOpenDocument()
.打開文件對(duì)象
.調(diào)用應(yīng)用程序的DeleteDontents();
.建立與此文件對(duì)象相關(guān)聯(lián)的CArchive對(duì)象
.調(diào)用應(yīng)用程序文檔對(duì)象的Serialize()函數(shù)
.關(guān)閉CArchive對(duì)象,文件對(duì)象
(2)顯示該文件窗口
b3.返回
三.文件保存
ON_COMMAND(ID_FILE_SAVE,CDocument::OnFileSave)
入口:CDocument::OnFileSave()
調(diào)用:CDocument::DoFileSave()
如果當(dāng)前文檔對(duì)應(yīng)的文件名為空或者為只讀文件,以NULL 為參數(shù)調(diào)用CDocument::DoSave(NULL),否則,以當(dāng)前文檔對(duì)應(yīng)的文件名為參數(shù)調(diào)用CDocument::DoSave(m_strPathName);
ON_COMMAND(ID_FILE_SAVEAS,CDocument::OnFileSaveAs)
入口:CDocument::OnFileSaveAs()
以NULL為參數(shù)直接調(diào)用CDocument::DoSave(NULL);
CDocument::DoSave(LPCTSTR lpszPathName,BOOL bReplace);
如果lpszPathName為NULL,
1.設(shè)定應(yīng)用程序默認(rèn)的文件名
2.打開通用文件保存對(duì)話框,由用戶設(shè)定保存文件的名字,并返回該文件名
如果lpszPahtName不為NULL,則跳為以上兩步,直接進(jìn)入下一步
3.調(diào)用應(yīng)用程序的OnSaveDocument()
31.用戶代碼
32.調(diào)用CDocument::OnSaveDocument()
a.創(chuàng)建或打開文件對(duì)象
b.建立相對(duì)應(yīng)的CArchive對(duì)象
c.調(diào)用應(yīng)用程序文檔對(duì)象的序列化函數(shù)Serialize()
d.關(guān)閉文件對(duì)象,CArchive對(duì)象
e.設(shè)置文件未修改標(biāo)志
4.返回