青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-19  評論-2  文章-0  trackbacks-0

2009-9-3

========================================================
《深入解析MFC》筆記 7.MFC的文檔/視圖結構
========================================================

文檔/視圖相互依賴關系
    · CWinApp包含一個 CDocManager 指針。
    · CDocManager 維護一個文檔模板鏈表,須在 CWinApp::IniInstance()中 創建并加入這些模板。
    · 文檔模板將這 3 個類綁定在一起: CView / CDocument / CFrameWnd。這些類都根據傳遞給文檔模板構造函數的CRuntimeClass信息創建
    · MDI 專有的文檔模板維護一個打開文檔鏈表,而 SDI 專有的文檔模板只有一個指向打開文檔的指針。
    · 文檔維護一個打開視圖的鏈表。使用這個鏈表與視圖通信、更新視圖。
    · 文檔有一個指針指向它們的文檔模板。用這個指針設置標題,進行命令路由選擇,在被刪除時通知文檔模板
    · 框架有一個指針指向當前的活躍視圖
    · 被創建時,框架等到一個 CCreateContext 結構,包含了在文檔模板中可以找到的CRuntimeClass信息和一個指向文檔的指針。
    · 視圖有一個指針指向它的文檔。當該視圖被刪除時,用該指針通知文檔。
    · 視圖可以通過調用 CView::GetParentFrame() 獲得它的框架窗口。
    · 如果文檔要訪問它的所有視圖的框架,可以遍歷它的視圖鏈表,并調用 CView::GetParentFrame().

    · CDocTemplate —— 在 CWinApp 中創建,保存在 CWinApp::m_pDocManage中
    · CDocManager —— 在CWinApp::InitInstance() 中創建
    · CFrameWnd —— 在 CDocTemplate::CreateNewFrame() 中創建
    · CDocument —— 在 CDocTemplate::CreateNewDocument() 中創建
    · CView —— 通過 CFrameWnd::OnCreate() 創建
                                                         
     ID_FILE_OPEN   →   CWinApp::OnFileOpen()                      CWinApp::OnFileNew()     ←   ID_FILE_NEW    
          命令                                 ↓                                                         ↓                                
                                          獲取文件名                                         一個文檔模板?  →否→        從用戶獲取文檔類型
                                                 ↓                                                          ↓                                               ↓
                                     使用文件拓展名,選擇文檔模板               是                                            ↓ 
                                                   ↓                                                         ↓                                            ↓
                                                    ------------------------------選擇的模板-------------------------------
         
         
                   選擇模板
                        ↓                                                               → →→打開? →→Yes→→  CMyDoc::OnOpenDocument()   →
     Construct document  object: CMyDoc                          ↑            ↓                                               ↓                                      ↓
                        ↓                                                               ↑            ↓                                               ↓                                      ↓                         
     Construct frame window object : CMainFrame             ↑              →→→→→→→CMyDoc::OnNewDocument()            ↓
                        ↓                                                               ↑                                                             ↓                                     ↓
          CframeWnd::Create()                                              ↑                                                     文檔準備好   ←←←←←←                              
     CFrameWnd::OnCreateClient()                                    ↑
                        ↓                                                               ↑                                                                                                                   
             Create CMyView            →→→→→→→→→→→→                             選擇模板之后的控制流程
         
         
           CWinApp::OnFileOpen()                                             CWinApp::OnFileNew()    
                         ↓                                                                                ↓
          CDocManager::OnFileOpen()                                   CDocManager::OnFileNew()
                                               ↓                                          ↓
                                           CDocTemplate::OpenDocumentFile()
                                           CDocTemplate::CreateNewDocument()
                                           CDocTemplate::CreateNewFrame()
                                                             WM_CREATE
                                                    CFrameWnd::OnCreate()
                                                CFrameWnd::OnCreateHelper()
                                                CFrameWnd::OnCreateClient()
                                                CFrameWnd::CreateView()
                                                CMyDocument::OnOpenDocument()
                                         [if file was specified to OpenDocumentFile()]
                                                CMyDocument::OnNewDocument()       
                                        創建文檔/視圖體系中所有對象過程中調用的函數
         
         
-----------
體系結構

    文檔與視圖
                    1)文檔;   2)視圖;   3)文檔/視圖框架;   4)文檔模版
    文檔
        由CDocument類體現,派生自CCmdTarget,具有CObject提供的所有支持,且可以接受命令消息,支持組件對象模型(COM)接口和 OLE 自動化。
    視圖
       
    文檔/視圖框架
    文檔模板                             《深入解析MFC》 P 198
        將整個機制綁定在一起。這3個組件由 CDocTemplate 的類管理。
        CDocTemplate是一個抽象基類,定義了處理文檔、框架和視圖的基本操作。
        CSingleDocTemplate:  4個參數①一個資源ID,②運行時的CDocument派生類;③ 運行時的試圖框架; ④ 運行時的文檔視圖。
                    資源ID:①窗口標題;②文檔名稱;③當創建一個新文檔時使用的文檔類型描述符;④對標準的打開文件對話框中文件類型的描述符
                                 ⑤文檔擴展名過濾器; ⑥ 文件管理器使用的文件類型描述符; ⑦ 在Windows注冊表中注冊的 ProgID。
        SMultiDocTemplage
                    可以支持一組文檔的鏈表,而CSingleDocTemplate只能支持一種文檔
                   
    CWinApp的角色
        文檔模板由 CWinApp 對象管理。
       
---------------
文檔/視圖結構內幕                    《深入解析MFC》P 199
    ------------------------------------
    CWinApp 管理文檔模板,文檔模板管理 框架/視圖/文檔。
   
    CWinApp / CDocTemplate 接口: CDocManager
        · CPtrList  m_templateList —— 維護一個文檔模板列表的指針。 通過GetFirstDocTemplatePosition()和GetNextDocTemplate()來遍歷模板列表。
       
        CDocManager::OnFileNew() 
            負責創建一個新的文檔模板
            · ①OnFileNew() 檢查 m_templateList 中是是否有多于一個文檔模板,若是,則創建一個 CNewTypeDlg 對話框,列出一個文檔鏈表以供用戶選擇。
            · ② 調用CDocTemplate::OpenDocumentFile(),
                tag:CNewTypeDlg的構造函數讀入一個指向文檔模板指針鏈表的指針,即 m_templateList。在DoModal() 之后,OnFileNew()從
                        CNewTypeDlg::m_pSelectdeTemplate 中得到選中的對話框模板。
           
            CNewTypeDlg   (DOCMGR.CPP)
                CNewTypeDlg::OnInitDialog()
                    · ①, 調用GetDlgItem() 得到一個指向 CListBox 指針,并將之類型轉換成 CListBox 指針。
                    · ②,得到指針后,遍歷它的文檔模板鏈表,遍歷時,通過調用CDocTemplate::GetDocString()得到文檔類型的字符串版本,
                            OnInitDialog獲取每個文檔的這個字符串并加入鏈表,再調用 CListBox::SetItemDataPtr() 將這個文檔模板指針附加到這項上。
                    · ③,返回到CDialog::OnInitDialog()。
                        tag:在CNewType::OnOK()中,當用戶選擇從鏈表中選擇了一項并按下OK按鈕時, CNewType::OnOK() 從量表中得到被選中的項,并調用
                              CListBox::SetItemDataPtr() 獲得指向該文檔模板的一個指針。 OnOK() 將這個被選中的模板指針放在 pSelectedTemplate 中,這樣,
                              DoModal() 返回后就可以獲取這個指針
    ----------------------------------------                         
    CDocTemplate:  CDocument、CView 和 CFrameWnd 管理器
   
        · m_nIDResource —— 存儲傳給 CDocTemplate 構造函數的第一個參數,是一個資源ID,
        · m_pDocClass —— 指向該文檔模板的CDocument(或派生類)的CRuntimeClass結構,在構造函數中設定
        · m_pFrameClass —— 指向該文檔模板的 CFrameWnd(或派生類)的CRuntimeClass 結構。在構造函數中設定
        · m_pViewClass —— 指向該文檔模板的CView (或派生類)的CRuntimeClass結構,在構造函數中設定。
        · m_strDocStrings —— 一個CString,包含用來定義與每個文檔模板聯系的7個字符串的字符串表資源。在LoadTemplate()中初始化。
       
        創建新的 文檔/視圖/框架
            CDocTemplate::CreateNewDocument()           (DOCTEMPL.CPP)   《深入解析MFC》P205
                · 首先,通過CRuntimeClass 指針的數據成員 m_pDocClass 調用 CRuntimeClass::CreateObject() 創建一個新的文檔
                · 在pDocument 中保存了 新的 CDocument(或派生類 ) 指針之后,驗證 CreateObject 是否已經工作,若失敗,返回NULL。
                    若成功,調用 AddDocument() 將該文檔加到打開文檔鏈表中。 CreateNewDocument() 返回指向新文檔的指針。
           
            CDocTemplate::CreateNewFrame()
                · 首先,填充一個CCreateContext(存放創建各種文檔/視圖結構元素所需的關鍵信息)。
                        1>. m_pNewViewClass —— 一個 CRuntimeClass 指針,用來創建視圖
                        2>. m_pCurrentDoc —— 指向當前文檔對象的指針
                        3>. m_pCurrentFrame  —— 指向當前框架對象的指針
                        4>. m_pNewDocTemplate —— 如果有多個文檔,指向最后一個;
                        5>. m_pLastView —— 如果有多個視圖,指向最后一個視圖。
                · 通過m_pFrameClass 中的 CRuntimeClass 結構調用 CRuntimeClass::CreateObject() 創建一個框架,再調用 LoadFrame()裝入
                  這個框架的資源,根據這些值創建該框架。 最后,CreateNewFrame()返回一個指向新框架的指針。 
   
            CSingleDocTemplate         《深入解析MFC》P 207
                    : CDocument* m_pOnlyDoc;
                        AddDocument() 將 m_pOnlyDoc 設置成參數;
               
            CMultiDocTemplate
                     :  AddDocument() 通過調用 m_docList.AddTail( pDocument ) 將新文檔加入自己的鏈表中。
                        CPtrList  m_docList;        
                        int m_nUntitledCount;  //記錄沒有標題的窗口數
           
            CMultiDocTemplate::OpenDocumentFile()
                    · 調用CreateNewDocument() 創建一個新的空文檔(一個CDocument派生對象),然后通過 CreateNewFrame() 創建一個新的框架,
                    · 若參數 lpszPathName 為NULL, 則OpenDocumentFile() 知道要創建的事一個空的新文檔,調用SetDefaultTitle()完成這個功能。
                        這個函數為新文檔確認名稱[使用Untitled與m_nUntitledCount中未命名計數的組合],然后通過新文檔指針調用CDocument::SetTitle()
                        設置新文檔名字,組后,OpenDocumentFile()調用 OnOpenDocumentFile(),并將未命名計數的數據成員加1.
                    · 若lpszPathName 不等于NULL,則 OpenDocumentFile() 嘗試打開指定的文檔,首先,OpenDocumentFile() 顯示一個等待光標,然后
                        調用CDocument::OnOpenDocumentFile(),將文檔名傳入作為參數。若調用失敗,則銷毀新創建的對話框,返回一個NULL。若調用成功,
                        則OpenDocumentFile() 調用 CDocument::SetPathName() 更新CDocument 的路徑。
                    ·不管lpszPathName的狀態時說明,OpenDocumentFile() 最后調用 CDocTemplate::InitializeUpdateFrame(),再調用            
                        CFrameWnd::InitialUpdateFrame(),  并傳遞一個指向新文檔的指針。
                       
    ****///---------------------------------------------
    CFrameWnd           (WINFRM.CPP)
       
        CFrameWnd 和 CView 的創建                       《深入解析MFC》P208
            視圖的創建:CFrameWnd::CreateView     
                在文檔模板在CreateNewFrame() 中創建框架時,Windows發出一個 WM_CREATE,進行如下調用
                            OnCreate ->  OnCreateHelper()  -> OnCreateClient()  ->  CreateView() 
            CreateView() 使用 CCreateContext::m_pNewViewClass 中存儲的 CRuntimeClass 創建一個視圖,創建完成后,調用 CWnd::Create()完成創建工作。
           
        CFrameWnd::InitialUpdateFrame()
            使框架中的所有視圖都被更新。
            · 首先,InitialUpdateFrame() 獲得一個活躍視圖的指針,并存放在 pView中,
            · 若 bMakeVisible 參數為TRUE, 則InitialUpdateFrame() 發出 WM_INITIALUPDATE 給他所有后代,這個消息被映射到 CView::OnInitialUpadte()。
                發送消息后,通過CView::OnActiveView() 激活視圖。
               
               
    ****///---------------------------------------------
    CDocument              (AFXWIN.H)
       
        · m_strTitle —— 文檔名,通過 SetTitle()設置,保存時用它來設定框架窗口的標題和文件的名字
        · m_strPathName —— 當前文檔的路徑(包括文件名)。用 SetPathname() 設置,是對MRU菜單的補充,保存文件時用到。
        · m_pDocTemplate —— 指向文檔的文檔模板的指針。 CDocTemplate::AddDocument()中設置,通過CDocTemplate::GetDocTemplate()訪問
        · m_viewList —— 記錄所有在該文檔下打開的所有視圖的指針。  文檔改變時,通過這個指針通知視圖。
                                   視圖通過AddView()加入到m_viewList中,RemoveView()刪除。
                                   GetFirstViewPosition() 和 GetNextView() 來遍歷
        · m_bModified —— “修改”標志位,被修改就設為 1。為1是框架在用戶關閉文檔時提示。  IsModified()   SetModifiedFlag()
        · m_bAutoDelete —— 被框架設置為 TRUE時,所有視圖關閉時該文檔對象要被刪除??稍O為 FALSE,文檔在沒有任何打開視圖時仍會保留
        · DisconnectViews() —— 該成員函數遍歷 m_viewlist 中保存的視圖鏈表,并將 CView::m_pDocument 指針設置為 NULL,從而將所有視圖從文檔上斷開。
        · DoSave() —— CDocument成員 OnFileSaveAs() 和 OnFileSave() 在提示輸入文件名或驗證文件名后,最終都調用 DoSave(),DoSave調用了 OnSaveDocument()
        · DoFileSave() —— 先檢查文檔要被存儲到的文件的一些性質,在調用 DoSave()。
        · UpdateFrameCounts() —— 計數為該文檔的所有視圖打開的框架,并根據新的技術通知更新它們的窗口標題。
        · SendInitialUpdate() —— 遍歷視圖鏈表并調用 CView::OnInitialUpdate()。
       
    創建文檔:             《深入解析MFC》P213
        ->  創建一個空的文檔,會調用 CDocument::OnNewDocument()。
                首先調用DeleteContents() 清空文檔(默認什么都不做),然后設置修改標志位為 FALSE,并確保 m_strPathName為空
               
        ->  CDocument::OnOpenDocument() 從一個文件創建文檔
                ①. 首先調用 CDocument::GetFile() 打開一個文件,該函數用給出的文件名調用 CFile::Open()。若打開成功,OnOpenDocument()調用DeleteContents()
            為文件的發序列化(de-serialization)作準備(從永久存儲設備讀入一個新的文檔)。調用SetModified()。 若序列化失敗,文檔被標記為“已修改”。
                ②. 根據pFile 創建一個 CArchive,并將這個 CArchive 傳遞給 CDocument::Serialize()。 若發序列化成功,關閉檔案并釋放文件
                ③. 最后,關閉修改標志位并返回TRUE
               
    保存文檔:
        CDocument::OnSaveDocument()
            通過GetFile()打開一個文件,使用標志指定文件是打開用來保存的(CFile:: mode ReadWrite|CFile::modeCreate)。
            創建CArchive,并將之床底給 Serialize() 成員函數。
            若成功序列化,關閉CArchive,標志位設置成 FALSE,返回TRUE。
           
    與視圖通信:
        m_viewlist 是 CDocument 與正在“視”這個文檔的視圖進行交互的中介。
            (需要交互的狀況)
            1. 通知視圖文檔被銷毀。  CDocument析構函數調用 DisconnectView()
            2. 從視圖出發,通過調用CView::GetParentFrame() 訪問框架,
            3. 通知視圖文檔被修改、需要更新, UpdateAllViews()完成這個功能
           
        CDocument::UpdateAllViews()
            首先調用 GetFirstViewPosition() 獲得 m_viewlist的第一個視圖;
            然后,遍歷整個視圖鏈表,除發送者的視圖外調用 CView::OnUpdate()。
           
                       
    ****///---------------------------------------------
    CView                           (AFXWIN.H)
   
        CView 繪圖
            CView::OnPaint()
                · 首先創建一個CPaintDC,包含要重畫的區域,
                · 將這個 paint DC 傳遞給 OnPrepareDC(),最后將 paint DC 傳給 OnDraw()。
                    tag:默認的 OnPrepareDC() 和 OnDraw() 實現不做任何事,
                       

posted on 2010-03-15 23:24 Euan 閱讀(2701) 評論(0)  編輯 收藏 引用 所屬分類: windows
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            性伦欧美刺激片在线观看| 国产亚洲成人一区| 久久久99国产精品免费| 性欧美长视频| 久久久www免费人成黑人精品 | 国内激情久久| 亚洲片在线观看| 亚洲图片欧洲图片日韩av| 亚洲欧美日韩国产综合精品二区| 欧美亚洲一级片| 免费视频亚洲| 一本色道88久久加勒比精品| 小辣椒精品导航| 欧美电影资源| 国产精品视频久久| 亚洲高清在线精品| 亚洲午夜黄色| 欧美大片免费久久精品三p | 亚洲视频在线视频| 久久久91精品国产一区二区精品| 欧美激情精品久久久久久黑人 | 亚洲视频中文| 亚洲性感激情| 亚洲美女视频在线免费观看| 亚洲另类春色国产| 性伦欧美刺激片在线观看| 欧美国产专区| 欧美一级午夜免费电影| 欧美日韩国产二区| 亚洲电影免费在线观看| 亚洲欧美久久久久一区二区三区| 欧美高清视频在线播放| 午夜精品福利电影| 欧美视频一区二区三区四区| 亚洲高清不卡av| 久久久久久伊人| 亚洲欧美国产毛片在线| 欧美交受高潮1| 亚洲国产1区| 久久综合网hezyo| 午夜精彩视频在线观看不卡| 欧美日韩一区二区三区视频| 亚洲日本aⅴ片在线观看香蕉| 久久久久久久一区二区三区| 亚洲一区综合| 欧美揉bbbbb揉bbbbb| 一本色道婷婷久久欧美| 欧美大片一区| 老司机一区二区三区| 在线观看视频日韩| 久久综合九色综合网站| 久久爱另类一区二区小说| 国产麻豆成人精品| 亚洲主播在线观看| 在线亚洲精品| 国产精品欧美一区喷水| 午夜精品久久久久久久99热浪潮 | 亚洲乱码一区二区| 欧美激情一区二区三区 | 亚洲免费成人| 亚洲激情网址| 欧美精品一区二区三区久久久竹菊| 最近中文字幕日韩精品| 欧美电影在线观看完整版| 蜜臀av一级做a爰片久久| 在线精品视频免费观看| 欧美激情bt| 欧美精品一区在线观看| 一区二区三区久久久| 亚洲午夜极品| 狠狠色丁香久久综合频道| 美女主播一区| 欧美日韩ab片| 久久国产日本精品| 亚洲第一精品夜夜躁人人爽| 亚洲高清一区二区三区| 欧美日韩亚洲成人| 久久精品一本| 亚洲精品一区二区三区av| 99国产精品久久久久老师| 欧美精品18videos性欧美| 亚洲欧美一区二区激情| 亚洲一卡二卡三卡四卡五卡| 中文日韩在线| 狠狠色狠狠色综合日日五| 免费久久99精品国产| 欧美啪啪一区| 久久精品中文| 欧美久久久久久| 欧美中文在线字幕| 欧美xx69| 久久久精品五月天| 欧美另类变人与禽xxxxx| 久久成人精品无人区| 欧美激情久久久| 久久精品亚洲精品| 欧美伦理a级免费电影| 久久成人精品| 国产精品老牛| 另类激情亚洲| 狠狠入ady亚洲精品经典电影| 影音先锋日韩有码| 亚洲清纯自拍| 国产在线成人| 一本色道久久综合狠狠躁的推荐| 狠狠爱成人网| 亚洲专区一二三| 一区二区三区波多野结衣在线观看| 午夜精品久久久久久久蜜桃app | 91久久精品视频| 狠狠色综合色区| 亚洲午夜一二三区视频| 亚洲国产高清在线| 久久精品成人一区二区三区| 亚洲免费在线视频| 欧美人妖另类| 最新中文字幕一区二区三区| 欧美三级在线| 亚洲电影免费观看高清完整版在线| 久久在线视频| 欧美一区二区视频在线观看2020| 一本大道久久a久久精品综合| 久久九九久久九九| 欧美一区二区三区视频在线观看| 欧美成人在线免费观看| 噜噜噜在线观看免费视频日韩| 国产精品一区二区你懂得| 日韩视频在线观看免费| 亚洲精品视频在线观看免费| 久色成人在线| 欧美va亚洲va香蕉在线| 激情综合色丁香一区二区| 欧美一区二区在线免费观看 | 久久免费精品视频| 亚洲女性裸体视频| 亚洲第一页自拍| 国产美女高潮久久白浆| 99成人在线| 99成人免费视频| 欧美高清在线| 亚洲欧洲视频| 一区二区三区成人| 国产精品久久久久久亚洲毛片| 日韩一级精品| 亚洲欧美日本伦理| 国产免费亚洲高清| 午夜视频一区在线观看| 久久久不卡网国产精品一区| 国产一区香蕉久久| 老司机67194精品线观看| 亚洲国产精品久久久久秋霞影院| 亚洲黄色尤物视频| 欧美日韩在线免费视频| 亚洲制服av| 欧美成人69av| 亚洲免费视频观看| 欧美亚洲免费| 亚洲视频在线观看网站| 欧美三区不卡| 欧美在线免费一级片| 欧美黑人一区二区三区| 一区二区三区日韩精品| 国产一区二区高清不卡| 蜜桃av噜噜一区| 亚洲午夜精品久久| 蜜臀久久99精品久久久画质超高清 | 性欧美精品高清| 亚洲第一福利在线观看| 亚洲一区二区毛片| 韩日在线一区| 欧美午夜无遮挡| 久久蜜臀精品av| 亚洲视频在线观看三级| 美女图片一区二区| 很黄很黄激情成人| a4yy欧美一区二区三区| 美国三级日本三级久久99| 欧美成人免费在线| 亚洲专区免费| 亚洲精品1区| 久久精品女人的天堂av| 亚洲精品免费在线观看| 国产精品一区二区三区乱码| 欧美大秀在线观看| 久久精品导航| 亚洲欧美区自拍先锋| 亚洲精品在线二区| 久久只精品国产| 午夜在线不卡| 亚洲性视频网址| 日韩一级不卡| 在线国产精品播放| 国产无一区二区| 国产精品成人v| 欧美日韩免费高清| 欧美劲爆第一页| 欧美国产日韩二区| 亚洲视频视频在线| 欧美在线视频播放| 亚洲女同在线|