CView是視圖程式設計中使用率最高的視窗對象,它是用戶的主要操作界面。因為它通常以某種形式表示文檔數據,所以稱之為視圖。一個視圖對象只關聯一個文檔對象;一個文檔對象可以關聯多個視圖,每個視圖對象以不同形式表示文檔數據。
基本介紹
- 中文名:CView
- 關聯對象:WM_CREATE
- 保存:文檔類將修改後保存到磁碟檔案
- 接受:用戶對文檔中數據的編輯和修改
介紹
關聯對象
IntCView::OnCreate(LPCREATESTRUCTlpcs){if(CWnd::OnCreate(lpcs)==-1)return-1;//m_pDocuemnt視圖成員,用於存儲相應文檔對象的指針,此時為空ASSERT(m_pDocument==NULL);CCreateContext*pContext=(CCreateContext*)lpcs->lpCreateParams;//pContext->m_pCurrentDoc是已經建立的文檔對象的指針if(pContext!=NULL&&pContext->m_pCurrentDoc!=NULL){//將當前視圖加入文檔對象的視圖列表中,因為一個文檔可關聯多個視圖pContext->m_pCurrentDoc->AddView(this);/*在文檔的AddView()函式中,已經將當前文檔對象指針賦給m_pDocument視圖成員。這樣,在視圖建立之初,二者就建立了關聯。*/ASSERT(m_pDocument!=NULL);}else{TRACE(“Warning:CreatingapanewithnoCDocument.\n”);}return0;//ok}
CDocument*CView::GetDocument()const{ASSERT(this!=NULL);returnm_pDocument;}
CView::~CView(){if(m_pDocument!=NULL)m_pDocument->RemoveView(this);}
視圖繪製
voidCView::OnPaint(){//CPaintDC類維護顯示設備CPaintDCdc(this);OnPrepareDC(&dc);OnDraw(&dc);}
virtualvoidOnDraw(CDC*pDC)=0;
虛函式
voidCView::OnUpdate(CView*pSender,LPARAM,CObject*){ASSERT(pSender!=this);UNUSED(pSender);//unusedinreleasebuildsInvalidate(TRUE);}
voidCView::OnInitialUpdate(){OnUpdate(NULL,0,NULL);}CalcWindowRect
voidCView::CalcWindowRect(LPRECTlpClientRect,UNITnAdjustType){//lpClientRect此時是整個視圖客戶區的尺寸//需要為滾動條增加尺寸嗎if(nAdjustType!=0){//調用API,根據視窗風格計算視窗尺寸::AdjustWindowRectEx(lpClientRect,0,FALSE,GetExStyle());DWORDdwStyle=GetStyle();if(dwStyle&WS_VSCROLL){//為垂直滾動條增加尺寸//afxData在.NET下需要#include<../../src/mfc/afximpl.h>//afxData在VC6.0下需要#include<../src/mfc/afximpl.h>intnAdjust=afxData.cxVScroll;if(dwStyle&WS_BORDER)nAdjust-=CX_BORDER;lpClientRect->right+=nAdjust;}if(dwStyle&WS_HSCROLL){//為水平滾動條增加尺寸intnAdjust=afxData.cyHScroll;if(dwStyle&WS_BORDER)nAdjust-=CY_BORDER;lpClientRect->bottom+=nAdjust;}return;}//無需為滾動條增加尺寸,調用基類成員完成計算CWnd::CalcWindowRect(lpClientRect,nAdjustType);}
voidCView::PostNcDestroy(){deletethis;}
BOOLCView::OnCmdMsg(UINTnID,intnCode,void*pExtra,AFX_CMDHANDLERINFO*pHandlerInfo){//首先查找自身的命令訊息映射if(CWnd::OnCmdMsg(nID,nCode,pExtra,pHandlerInfo))returnTRUE;//如果視圖本身沒有處理該命令,將機會留給與其關聯的文檔對象if(m_pDocument!=NULL){CPushRoutingViewpush(this);returnm_pDocument->OnCmdMsg(nID,nCode,pExtra,pHandlerInfo);}returnFALSE;}
voidCView::OnActivateView(BOOLbActivate,CView*pActivateView,CView*){UNUSED(pActivateView);//unusedinreleasebuildsif(bActivate)//當前狀態為活動嗎{ASSERT(pActivateView==this);//如果其父視窗也是活動的,則設定焦點。(在MDI中,其父框架可能是非活動的)if(IsTopParentActive())SetFocus();}}
派生類
CScrollView:提供滾動支持;CCtrlView:支持tree、list和richedit控制項;CDaoRecordView:在dialog-box控制項中顯示資料庫記錄;CEditView:提供了一個簡單的多行文本編輯器視圖;CFormView:包含dialog-box控制項,可滾動,基於對話框模板資源;CListView:支持列表控制項視圖;CRecordView:在dialog-box控制項中顯示資料庫記錄;CRichEditView:支持富文本編輯的控制項視圖;CTreeView:支持重點在樹控制項的文檔/視圖結構的視圖。