国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
mfc中cview類有什么作用?
來源:互聯(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)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
MFC 自繪
文檔視圖框架總結(jié)--My Blog Homepage
文檔與視圖的相互作用
如何聯(lián)系CMainFrame和CView各自的成員變量? VC/MFC / 界面
·教程:輕松玩轉(zhuǎn)MFC文檔視圖架構(gòu)編程
MFC多文檔和單文檔視結(jié)構(gòu)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服