构造自定义的视图类CMyview

//////////////////////////////////////////////////////////////////
////CView类的主要成员函数
void CView::OnInitialUpdate()
{  
  OnUpdate(NULL, 0, NULL);  // initial update
}
void CView::OnUpdate(CView* pSender, LPARAM /*lHint*/, CObject* /*pHint*/)
{  
  ASSERT(pSender != this);  
  UNUSED(pSender);     // unused in release builds
 
  // invalidate the entire pane, erase background too  
  Invalidate(TRUE); // Windows will send a WM_PAINT message
}
void CView::OnPaint() 
{
  // standard paint routine  
  CPaintDC dc(this);  
  OnPrepareDC(&dc);  
  OnDraw(&dc);  //
using OnDraw() to perform the rendering
}
//////////////////////////////////////////////////////////////////
////CMyView类的主要成员函数及调用关系
//CWnd::
Create()->CMyView(void)->OnInitialUpdate()->Oncreate()->CView::OnUpdate()->CWnd::OnPaint()-->OnDraw(CDC* pDC)-->ShowData(true)-->GetData()/SetData()
//CFrameWnd::CreateView()->CMyView(void)->OnInitialUpdate()-->CView::OnUpdate()-->CWnd::OnPaint()-->OnDraw(CDC* pDC)-->ShowData(true)-->GetData()/SetData()
 1 class CMyView : public CView
 2 {
 3     DECLARE_DYNCREATE(CMyView)
 4 public:
 5     CMyView(void);
 6     virtual ~CMyView(void);
 7 public:
 8     int OnCreate(LPCREATESTRUCT lpCreateStruct);
 9     void OnInitialUpdate();  // 构造函数执行后被调用,一般是在调用父类初始化方法的基础上,添加自定义的视图初始化动作
10     void OnDraw(CDC* pDC);   //自定义视图绘画操作
11   void ShowData(BOOL filterchanged = false); //显示数据
12   inline void GetData(...); //获取数据
13   inline void SetData(...);  //修改数据
14 }; 
void Myview::OnDraw(CDC* pDC)
{
  //自定义画图操作功能
  ShowData(true);

}
void MyView::ShowData()
{
  //自定义数据显示功能
  GetData()/SetData(); //获取or修改数据用于之后的显示
}


//////////////////////////////////////////////////////////////////
////补充说明

(1) OnDraw()与OnPaint()的关系
Windows会发送两种消息:
WM_NCPAINT(通知非客户区有变化)和
WM_PAINT(通知客户区有变化)
非客户区的重画系统会处理,而客户区的重画则需要我们自己来完成;
客户区的重画一般会放在OnDraw()或OnPaint()中实现;

CView类是派生自CWnd类:
OnDraw()是CView类的成员函数,没有响应消息的功能
OnPaint()是CWnd类的成员函数,响应系统的WM_PAINT消息
当系统发送WM_PAINT消息时,OnPaint()会直接响应处理,而OnDraw()则需要通过在OnPaint()中调用才会间接得到响应;

(2) 若视图已与某一文档关联,则可通过该文档对象,来通知相关视图更新
void CDocument::UpdateAllViews(CView* pSender, LPARAM lHint, CObject* pHint)
{
  ASSERT(pSender == NULL || !m_viewList.IsEmpty());   // must have views if sent by one of them  
  POSITION pos = GetFirstViewPosition();  
  while (pos != NULL)
  {  
    CView* pView = GetNextView(pos);  
    ASSERT_VALID(pView);  
    if (pView != pSender)    
      pView->OnUpdate(pSender, lHint, pHint);  
  } 
}
例如:
class CMyDocument : publicCDocument{ GetMyDocument(); }
CMyDocument* pDoc = GetMyDocument();
pDoc->UpdateAllViews(NULL,0,this);



 

posted on 2012-10-30 17:25  Offen_Lou  阅读(337)  评论(0)    收藏  举报

导航