• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • Visual C++應用框架揭密

    發表于:2007-07-14來源:作者:點擊數: 標簽:
    北京理工大學光電工程系 盧英威 Visual C++應用框架提供的強大功能,為我們的程序 開發 提供了極大的方便,利用其應用生成器可以很輕松地生成應用程序的框架.許多常用功能,例如文檔的創建,文件的打開,保存等操作的大部分代碼都由應用框架來完成.這些操作對于開
    北京理工大學光電工程系 盧英威

    Visual C++應用框架提供的強大功能,為我們的程序開發提供了極大的方便,利用其應用生成器可以很輕松地生成應用程序的框架.許多常用功能,例如文檔的創建,文件的打開,保存等操作的大部分代碼都由應用框架來完成.這些操作對于開發軟件的用戶而言,是透明的. Microsoft公司的設計Visual C++的初衷是盡量向用戶提供盡可能簡單的接口,但是,正是因為應用框架的這一透明性,使Visual C++的運行流程顯得非常神秘,當涉及這些Visual C++已經提供的功能模塊的軟件開發時,用戶(特別是那些剛剛接觸Visual C++的)不知道什么時候該使用什么接口函數,想改變Visual C++的一些默認操作時也不知道該從哪兒下手,使開發的難度增加.
    本人在編程實踐中發現,可以通過Visual C++自帶的強大的Debug調試工具,跟蹤應用框架代碼,從而得出應用框架操作的部分流程.具體實現是:利用Visual C++應用生成器生成應用框架代碼,啟動 Classwizard,在各個類中加入欲跟蹤的接口函數,編輯接口函數,設置斷點,再啟動Debug進行單步跟蹤調試.利用這一方法,我們還可以跟蹤 Visual C++提供的例子代碼.在跟蹤過程中,Visual C++的核心代碼是禁止跟蹤調試的,我們只要跳過就行.
    以下是本人對多文檔應用程序的文檔創建,文件的打開, 保存(另存為)操作的跟蹤結果,單文檔應用與多文檔應用的操作流程基本相似,只是用CSingleDocTemplate類的同名函數來替代對 CMultiDocTemplate類同名函數的調用.以下說明中,"應用程序"均指用戶生成的基于應用框架的實際程序,"用戶代碼"指用戶在接口函數中加入的代碼.
    一.創建文檔
    ON_COMMAND(ID_FILE_NEW,CWinApp::OnFileNew)
    入口:CWinApp::OnFileNew
    調用:CdocManager::OnFileNew()
    1.判斷有無文檔模板,無則函數返回;
    2.判斷是否有多個文檔模板,如有則啟動文檔模板選擇對話框, 讓用戶選擇一個模板后,返回模板指針.
    3.由模板指針訪問CMultiDocTemplate::OpenDocumentFile()
    31.創建新文檔對象
    32.創建與新文檔對象對應的子框架,構筑子框架,文檔和視窗之間的關系
    33.調用應用程序的OnNewDocument()
    a.調用CDocument::OnNewDocument()
    調用應用程序的DeleteContents();
    b.用戶代碼
    34.調用InitialUpdateFrame()顯示視窗
    35.返回文檔指針
    4.返回

    二.打開文檔
    ON_COMMAND(ID_FILE_OPEN,CWinApp::OnFileOpen)
    入口:CWinApp::OnFileOpen
    調用:CDocManager::OnFileOpen()
    1.彈出對話框讓用戶選擇待打開的文件,返回該文件的全路徑名稱, 供下面函數調用時使用.
    2.調用應用程序的OpenDocumentFile(LPCTSTR lpszFileName)
    21.用戶代碼
    22.調用CWinApp::OpenDocumentFile(lpszFileName),
    調用CWinApp::OpenDocumentFile(lpszFileName),
    調用CDocManager::OpenDocumentFile
    a.判斷有無該文件的打開文檔對象,有則激活該窗口并返回
    b.調用CMultiDocTemplate::OpenDocumentFile()
    b1.創建新的文檔對象,創建新文檔對象對應的子框架
    b2.調用應用程序的OnOpenDocument()
    (1)調用CDocument::OnOpenDocument()
    .打開文件對象
    .調用應用程序的DeleteDontents();
    .建立與此文件對象相關聯的CArchive對象
    .調用應用程序文檔對象的Serialize()函數
    .關閉CArchive對象,文件對象
    (2)顯示該文件窗口
    b3.返回

    三.文件保存
    ON_COMMAND(ID_FILE_SAVE,CDocument::OnFileSave)
    入口:CDocument::OnFileSave()
    調用:CDocument::DoFileSave()
    如果當前文檔對應的文件名為空或者為只讀文件,以NULL 為參數調用CDocument::DoSave(NULL),否則,以當前文檔對應的文件名為參數調用CDocument::DoSave(m_strPathName);

    ON_COMMAND(ID_FILE_SAVEAS,CDocument::OnFileSaveAs)
    入口:CDocument::OnFileSaveAs()
    以NULL為參數直接調用CDocument::DoSave(NULL);
    CDocument::DoSave(LPCTSTR lpszPathName,BOOL bReplace);
    如果lpszPathName為NULL,
    1.設定應用程序默認的文件名
    2.打開通用文件保存對話框,由用戶設定保存文件的名字,并返回該文件名
    如果lpszPahtName不為NULL,則跳為以上兩步,直接進入下一步
    3.調用應用程序的OnSaveDocument()
    31.用戶代碼
    32.調用CDocument::OnSaveDocument()
    a.創建或打開文件對象
    b.建立相對應的CArchive對象
    c.調用應用程序文檔對象的序列化函數Serialize()
    d.關閉文件對象,CArchive對象
    e.設置文件未修改標志
    4.返回

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>