2009-9-7
========================================================
《深入解析MFC》筆記 8.MFC的文檔/視圖結(jié)構(gòu) 拓展
========================================================
----------------------------
CMirrorFile 《深入解析MFC》 P221
CMirrorFile::Open() (DOCCORE.CPP)
第一部分:先檢查 modeCreate,看調(diào)用者是想創(chuàng)建一個新文件還是想連接在已有文件后面。
然后調(diào)用CFile::GetStatus(),若文件非空,返回一個非零的數(shù);
若文件存在,Open()接著會調(diào)用GetDiskFreeSpace(),確定驅(qū)動器有多少字節(jié)可以用。將結(jié)果和已有文件大小的兩倍進(jìn)行比較。
若大于后者,創(chuàng)建一個臨時文件,文件名存儲在 m_strMirrorName 中。
第二部分當(dāng) m_strMirrorName 非空時執(zhí)行。
調(diào)用 CFile::Open() 打開鏡像文件,然后將文件的時間和文件權(quán)限從源文件拷貝給鏡像文件。
若執(zhí)行了第二部分,Open() 返回TRUE,若沒有被執(zhí)行,會調(diào)用 CFile::Open(), 返回調(diào)用結(jié)果。
(若有寫操作正在執(zhí)行或者有文件被覆蓋,CMirrorFile::Open() 就打開一個和指定文件不同的文件。
CMirrorFile::Close()
先在 m_strName 存儲文件的名字,在調(diào)用CFile::Close() 之后,檢查是否使用了鏡像文件,若使用了,Open()會刪除指定 文件,將文件拷貝為指定文件。
即CMirrorFile 通過保存原有文件和對臨時文件進(jìn)行寫操作來保護(hù)你的文檔。
這樣,若寫操作出現(xiàn)問題,源文件也是安全的 。
CMirrorFile 還會確保源文件的安全性以 及文件創(chuàng)建信息是否能被正確地拷貝
---------------------------
CView 打印 《深入解析MFC》 P223 - 235
---------------------------
CView的派生類: CScrollView
調(diào)用SetScrollSizes() 讓 CScrollView 知道你的“邏輯視圖”的大小,獲得大小信息后,操縱傳遞給 OnDraw() 的DC,從而支持滾動
CScrollView 如何運(yùn)作:
CScrollView ( VIEWSCRL.CPP )
· m_nMapMode —— 在 SetScrollSizes() 中,可以為應(yīng)用程序指定一個映射模式。默認(rèn)為MM_NONE,CScrollView定義為(MM_SCALETOFIT)。
· m_totalLog —— 邏輯坐標(biāo)中視圖的大小,這個值通過 SetScrollSizes() 成員函數(shù)傳遞給 CScrollView。
· m_totalDev —— 設(shè)備坐標(biāo)中視圖的大小。
· m_pageDev —— 設(shè)備坐標(biāo)中一個頁的大小。
· m_lineDev —— 設(shè)備中一條線的大小。
· m_bCenter —— CPreviewView 使用這個數(shù)據(jù)成員進(jìn)入窗口中的視圖。
· CenterOnPoint() —— 將視圖集中于一點,由 CPreviewView 調(diào)用
· ScrollToDevicePosition() —— 負(fù)責(zé)滾動視圖。通過調(diào)用::SetScrollPos() 和 ::CSrollWindow() 更新滾動條,來完成視圖的滾動條。
· UpdateBars() —— CScrollView 在初始化的時候和窗口大小發(fā)生變化的時候調(diào)用。責(zé)任是根據(jù) GetScrollBarState() 的返回信息隱藏、顯示、初始化滾動條。
· GetTrueClientSize() —— 用來確定用戶視圖是否足夠大(是否需要滾動條),只有 UpdateBars 才會調(diào)用這個函數(shù)。
· GetScrollBarSizes() —— 確定滾動條的寬度和高度,考慮了窗口的風(fēng)格和邊框的寬度。
· GetScrollBarState() —— 獲取 CScrollView 所需要的關(guān)于視圖的狀態(tài)。
· CalcWindowRect() —— 計算窗口矩形的大小,考慮滾動條和其他窗口飾物的大小。
· OnPrepareDC() —— CScrollView 和 ONVScroll() 交互的關(guān)鍵。
· OnScroll() —— OnHScroll() 和 OnVScroll兩個消息處理函數(shù)都調(diào)用了這個函數(shù)。根據(jù)頁面大小和行大小確定要滾動的量。再調(diào)用 OnScrollBy()
· OnScrollBy() —— 檢查需要滾動的量是否超出了滾動條的范圍和視圖的邏輯大小。若沒有,調(diào)用 ::SetScrollPos() 移動滾動條,在調(diào)用 ::ScrollWindow().
· OnSize() —— 若 CScrollView 不是處于“scale-to-fit”模式下,OnSize() 調(diào)用 UpdateBars();否則,調(diào)用 SetScaleToFitSize()。
· OnHScroll() —— 調(diào)用 OnScroll() 的消息處理函數(shù)。
· OnVScroll() —— 調(diào)用 OnScroll() 的消息處理函數(shù)。
CScrollView::SetScrollSizes() (VIEWSCRL.cpp) 《深入解析MFC》P239
①. 將 m_nMapMode 初始化為提供的新映射模式, m_totalLog 的初始化值是sizeTotal 參數(shù)。
②. 在棧上創(chuàng)建一個 CWindowDC,并且在設(shè)置了映射模式之后,使用DC 來計算視圖大小、頁面大小和行大小的設(shè)備坐標(biāo)。
③. 將邏輯坐標(biāo)轉(zhuǎn)化為設(shè)備坐標(biāo)后,檢查確保用戶提供了一個非默認(rèn)的值,若為默認(rèn)值0,頁面大小設(shè)為視圖大小的1/10,行為頁的1/10或視圖的1/100。
④. 若需要,調(diào)用 UpdateBars() 和 Invalidate()。設(shè)置滾動條,若修改了映射模式,重畫。
CScrollView::OnPrepareDC() 在調(diào)用 OnDraw()之前調(diào)用
①. 設(shè)置映射模式,若在“scale-to-fit”模式下,模式設(shè)置為 ANISOTROPIC,然后對窗口和視圖端口操作,知道視圖的大小和客戶窗口匹配。
若不是,調(diào)用 SetMapMode(), 參數(shù)是用戶通過 SetScrollSizes() 指定的映射模式。
②. 在棧上創(chuàng)建一個 CPoint ptVpOrg(assume no shift for printing),初始化為 0,0。 若視圖不在打印, ptVpOrg = -GetDeviceScrollPosition()
③. 調(diào)用 CDC::SetViewportOrg( ptVpOrg )。然后調(diào)用 CView::OnPrepareDC()。
-------------------------------------
CFormView
先用資源編輯器創(chuàng)建一個對話框模板,然后創(chuàng)建一個CFormView 的派生類,然后將它和對話框模板綁定(通過將模板的資源ID 傳遞給 CFormView 構(gòu)造函數(shù))
(VIEWFORM.CPP) 《深入解析MFC》 P242
· m_lpszTemplateName —— 對話框模板資源的名字
· m_pCreateContext —— 指向 CCreateContext 的指針。CFormView不直接使用,會再 OnCreate() 函數(shù)中將它傳送給框架。
· m_hWndFocus —— 在 OnSetFocus() 中,CFormView將焦點設(shè)置為窗口句柄, OnActivateView(),OnActivateFrame()。
· OnDraw() —— 什么都不做,Windows控件都會重畫自己。
· PreTranslateMessage() —— 完成一些路由的任務(wù),將控件、視圖和窗口的消息送往正確的目的地
· SaveFocusControl() —— 將 m_hWndFocus 設(shè)置為 ::GetFocus() 的返回結(jié)果,即當(dāng)前處于焦點的控件。
· OnActivateFrame() —— 當(dāng)視圖被禁用時,調(diào)用 SaveFocusControl() 確保當(dāng)焦點回來是,焦點的控件仍有控制。
· OnActivateView —— 設(shè)置 m_hWndFocus 變量
· OnCreate() —— 將m_pCreateContext 傳遞給 LPCREATESTRUCT 結(jié)構(gòu)指針的 lpCreateParams 域。
· OnSetFocus() —— 若 m_hWndFocus 指向一個合法窗口,OnSetFocus()會將焦點設(shè)為這個控件。否則將焦點設(shè)為源窗口。
CFormView::Create()
①. 在m_pCreateContext 中存儲 CCreateContext 參數(shù),這樣就可以再調(diào)用 OnCreate() 時傳入。然后確保 Windows通用控件都是注冊過的。
②. 調(diào)用PreCreateWindow 來確定用戶指定的擴(kuò)展風(fēng)格,在調(diào)用 CWnd::CreateDlg()。這個函數(shù)從應(yīng)用程序的資源中裝載對話框模板,
并調(diào)用CWnd::CreateDlgIndirect()。CreateDlg() 創(chuàng)建一個非模態(tài)的對話框。
③. 將m_pCreateContext 設(shè)置為 NULL,再修改窗口的標(biāo)準(zhǔn)風(fēng)格和擴(kuò)展風(fēng)格。將窗口控件的標(biāo)示符設(shè)置為 nID 參數(shù)。
再調(diào)用 SetScrollSizes() 來初始化 ScrollView,采用的映射模式為 MM_TEXT。就創(chuàng)建了一個和對話框模板一樣大的邏輯視圖。
④. 將視圖的大小和 rect 參數(shù)的值匹配,再在 PreCreateWindow() 中調(diào)用指定了 WS_VISIBLE,就調(diào)用 ShowWindow()。
CFormView::OnInitialUpdate()調(diào)用了 UpdateData(FALSE) 來初始化窗體中的控件。 DDX/DDV就認(rèn)為CFormView是一個對話框。
--------------------------------
CCtrlView 《深入解析MFC》 P244
CCtrlView 派生以下類: CEditView、CListView、CTreeView、CRichEditView
· m_strClass —— 包含了控件的窗口類的名字,通常是“viewized”。在構(gòu)造函數(shù)中設(shè)置。
· m_dwDefaultStyle —— 視圖類的默認(rèn)風(fēng)格。通過構(gòu)造函數(shù)傳入。
· OnDraw() —— 從不被調(diào)用,調(diào)用了 ASSERT(FALSE)來確保不被調(diào)用。
· PreCreateWindow() —— 設(shè)置CREATESTRUCT 的 lpszClass 域,設(shè)置成 m_strClass 成員數(shù)據(jù),這樣就創(chuàng)建了控件。
還對 CREATESTRUCT 的風(fēng)格域操作,以反映存儲在 m_dwDefaultStyle 中的值。
· OnPaint() —— 調(diào)用 Default()。Default() 會將前一個消息(WM_PAINT)發(fā)送給DefWindowProc()。
CTreeView (VIEWCMN.CPP,AFXCVIEW.INL)
· GetTreeCtrl() —— 返回一個 CTreeCtrl 引用,類的使用者可以用這個引用直接調(diào)用 CTreeCtrl,對樹控件操作。
· RemoveImageList() —— 一個內(nèi)部輔助函數(shù),將控件的圖像鏈表清空。這個輔助函數(shù)會再 OnDestroy() 中被調(diào)用
· OnDestroy() —— 清空 LSVIL_NORMAL 和 LVSIL_STATE 兩個圖像鏈表,調(diào)用 RemoveImageList()。
posted on 2010-03-15 23:25
Euan 閱讀(2273)
評論(0) 編輯 收藏 引用 所屬分類:
windows