//////////////////////////////////////////////////////////////////
////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);