來源:互聯(lián)網(wǎng)
發(fā)表時間:2017/1/12 11:24:03
責(zé)任編輯:李志喜
字體:
為了幫助網(wǎng)友解決“mfc中cview類有什么作用?”相關(guān)的問題,學(xué)網(wǎng)通過互聯(lián)網(wǎng)對“mfc中cview類有什么作用?”相關(guān)的解決方案進(jìn)行了整理,用戶詳細(xì)問題包括:RT,我想知道:mfc中cview類有什么作用?,具體解決方案如下:
解決方案1:
可調(diào)用的封裝函數(shù)有哪些
解決方案2:
cview類是負(fù)責(zé)每個軟件系統(tǒng)向顯示器輸出各種信息流以及控制處理的類,但是它不負(fù)責(zé)物理層的輸出操作,因為windows是一個具有與設(shè)備無關(guān)性的操作系統(tǒng),cview類同過相應(yīng)一系列傳送給他的一些列消息,通過自已的一系列函數(shù)與之相映射,然后將消息傳送給專門用來描述輸出設(shè)備的CDC對象來完成顯示信息的。。。具體的封裝函數(shù)太多了介紹幾個重要的,具體的可以去查msdn。關(guān)聯(lián)文檔對象 視圖需要表示文檔數(shù)據(jù),所以文檔對象與視圖對象必須建立關(guān)聯(lián)。這樣,當(dāng)文檔數(shù)據(jù)發(fā)生變化時,它可以及時通知視圖;當(dāng)視圖需要顯示不同的文檔數(shù)據(jù)時,它可以從文檔對象中提取?! ≡谖臋n/視圖框架程序中,文檔對象總是在視圖之前建立,而在視圖的WM_CREATE消息處理函數(shù)中,建立了它與文檔對象的關(guān)聯(lián)。代碼如下: Int CView::OnCreate (LPCREATESTRUCT lpcs) { if (CWnd::OnCreate(lpcs) == -1) return -1; // m_pDocuemnt視圖成員,用于存儲相應(yīng)文檔對象的指針,此時為空 ASSERT(m_pDocument == NULL); CCreateContext* pContext = (CCreateContext*)lpcs->lpCreateParams; // pContext->m_pCurrentDoc是已經(jīng)建立的文檔對象的指針 if (pContext != NULL && pContext->m_pCurrentDoc != NULL) { // 將當(dāng)前視圖加入文檔對象的視圖列表中,因為一個文檔可關(guān)聯(lián)多個視圖 pContext->m_pCurrentDoc->AddView(this); /* 在文檔的AddView()函數(shù)中,已經(jīng)將當(dāng)前文檔對象指針賦給m_pDocument視圖成員。這樣,在視圖建立之初,二者就建立了關(guān)聯(lián)。*/ ASSERT(m_pDocument != NULL); } else { TRACE(“Warning: Creating a pane with no CDocument.\n”); } return 0; // ok } 同時,視圖類定義了成員函數(shù)GetDocument(),返回文檔對象的指針。代碼如下: CDocument* CView::GetDocument() const { ASSERT(this != NULL); return m_pDocument; } 視圖總是在文檔對象之前銷毀,在視圖的析構(gòu)函數(shù)中,與文檔對象解除關(guān)聯(lián)。代碼如下: CView::~CView() { if (m_pDocument != NULL) m_pDocument->RemoveView(this); }編輯本段視圖的繪制 窗口的繪制工作總是在WM_PAINT消息處理中進(jìn)行的,當(dāng)窗口需要繪制時,它會收到系統(tǒng)發(fā)來的WM_PAINT消息。在繪制過程中,首先要準(zhǔn)備顯示設(shè)備句柄,最后要釋放句柄。眾所周知,在視圖窗口中繪制,無需重載WM_PAINT消息處理函數(shù)OnPaint(),因為有一個更加友好的繪制新口:OnDraw()。該函數(shù)的實參是一個已經(jīng)準(zhǔn)備好的顯示設(shè)備,最后無需釋放。其實,這一切還是WM_PAINT消息處理函數(shù)OnPaint()為我們準(zhǔn)備的,代碼如下: void CView::OnPaint() { // CPaintDC類維護(hù)顯示設(shè)備 CPaintDC dc(this); OnPrepareDC(&dc); OnDraw(&dc); } OnPrepareDC()是一個虛擬函數(shù),它總是在OnDraw()之前執(zhí)行,可以重載它,設(shè)置繪圖模式。因為OnDraw()每次執(zhí)行,都使用不同的CPaintDC對象,所以本次繪圖模式的狀態(tài)不能保留到下一次?! nDraw()在視圖基類CView中定義為純虛函數(shù)。例如: virtual void OnDraw(CDC* pDC) = 0; 所以CView是抽象基類,不能實例化,而派生類必須重載OnDraw()。編輯本段虛函數(shù) OnUpdate 當(dāng)文檔數(shù)據(jù)發(fā)生變化時,文檔對象調(diào)用CDocument::UpdateAllView()通知所有視圖,作為響應(yīng),視圖的OnUpdate()成員被調(diào)用。所以,重載的OnUpdate()應(yīng)該能夠根據(jù)需要,將文檔數(shù)據(jù)的變化反映在視圖中。CView::OnUpdate()只是簡單地使客戶區(qū)無效,導(dǎo)致客戶區(qū)重畫。例如: void CView::OnUpdate(CView* pSender, LPARAM, CObject*) { ASSERT(pSender != this); UNUSED(pSender); // unused in release builds Invalidate(TRUE); }編輯本段虛函數(shù) OnInitialUpdate() 在初始創(chuàng)建、調(diào)用OnCreate()之后,或者在File/New、File/Open命令后被框架調(diào)用?;怌View::OnInitialUpdate()只是簡單地調(diào)用OnUpdate(),可以重載它完成初始化工作。但注意,它可能被多次調(diào)用?! oid CView::OnInitialUpdate() { OnUpdate(NULL, 0, NULL); }編輯本段虛函數(shù) CalcWindowRect 每當(dāng)主框架窗口的客戶區(qū)尺寸發(fā)生變化或控制條的位置發(fā)生變化,需要重新排列客戶區(qū)時,調(diào)用該函數(shù),根據(jù)視圖客戶區(qū)尺寸計算視圖窗口的尺寸?! ∥覀冎?,排列主窗口客戶區(qū)是由CFrameWnd::RecalcLayout()完成的。顯然,視圖的CalcWindowRect()函數(shù)也是由它觸發(fā)調(diào)用的。主窗口的客戶區(qū)尺寸減掉所有控制占用的部分,剩下的區(qū)域分給視圖,這部分區(qū)域作為實參傳入CalcWindowRect()。在CalcWindowRect()函數(shù)內(nèi),需要計算視圖窗口的尺寸。代碼如下: void CView::CalcWindowRect(LPRECT lpClientRect, UNIT nAdjustType) { // lpClientRect此時是整個視圖客戶區(qū)的尺寸 // 需要為滾動條增加尺寸嗎 if (nAdjustType != 0) { // 調(diào)用API,根據(jù)窗口風(fēng)格計算窗口尺寸 ::AdjustWindowRectEx(lpClientRect, 0, FALSE, GetExStyle()); DWORD dwStyle = GetStyle(); if (dwStyle & WS_VSCROLL) { // 為垂直滾動條增加尺寸 int nAdjust = afxData.csVScroll; if (dwStyle & WS_BORDER) nAdjust -= CX_BORDER; lpClientRect->right += nAdjust; } if (dwStyle & WS_HSCROLL) { // 為水平滾動條增加尺寸 int nAdjust = afxData.cyHScroll; if (dwStyle & WS_BORDER) nAdjust -= CY_BORDER; lpClientRect->bottom += nAdjust; } return; } // 無需為滾動條增加尺寸,調(diào)用基類成員完成計算 CWnd::CalcWindowRect(lpClientRect, nAdjustType); }編輯本段虛函數(shù)PostNcDestroy 在視圖窗口關(guān)閉時最后調(diào)用的成員函數(shù),它與CFrameWnd::PostNcDestroy完成相同的功能,即刪除視圖對象。代碼如下: void CView::PostNcDestroy() { delete this; } 這樣,可以不必關(guān)心視圖的釋放工作,即使它在堆中構(gòu)造。編輯本段虛函數(shù)OnCmdMsg 在討論CFrameWnd::OnCmdMsg()時已經(jīng)了解過該函數(shù),下面只給出它的代碼: BOOL CView::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) { // 首先查找自身的命令消息映射 if (CWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) return TRUE; // 如果視圖本身沒有處理該命令,將機(jī)會留給與其關(guān)聯(lián)的文檔對象 if (m_pDocument != NULL) { CPushRoutingView push(this); return m_pDocument->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo); } return FALSE; }編輯本段虛函數(shù) OnActivateView 當(dāng)視圖被激活為活動視圖,或由活動轉(zhuǎn)為非活動時,調(diào)用該函數(shù)通知視圖?;惖膶崿F(xiàn)只是設(shè)置該視圖為焦點。代碼如下: void CView::OnActivateView(BOOL bActivate, CView* pActivateView, CView*) { UNUSED(pActivateView); // unused in release builds if (bActivate) // 當(dāng)前狀態(tài)為活動嗎 { ASSERT(pActivateView == this); // 如果其父窗口也是活動的,則設(shè)置焦點。(在MDI中,其父框架可能是非活動的) if (IsTopParentActive()) SetFocus(); } }
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。