在Doc/View框架下,窗口的重绘主要由以下几个函数来完成
CDocument::UpdateAllViews
CView::OnUpdate
CWnd::Invalidate 或CWnd::InvalidateRect
CView::OnDraw
当doc管理的资料发生变化时,在doc中调用UpdateAllViews,来通知view更新其显示内容,view并不是直接调用OnDraw,而是OnUpdate被调用,用可以重新设定需要重绘的区域即无效区,在OnUpdate中调用Invalidate或InvalidateRect 都会引起OnDraw的调用,view才能最终得到重绘。
/////通知view重绘
void CMyDoc::OnTest()
{
UpdateAllViews(NULL);
}
///设置重绘区
void CMyView::OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/)
{
//////// 重绘区代码
MessageBox(_T("on update"));
Invalidate();///WM_PAINT 消息的发出和它有关
}
void CMyView::OnDraw(CDC* pDC)
{
CSMDTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
pDC->GetClipBox(&rect); //获取重绘的区域
MessageBox(_T("on draw "));
}