FROM:http://hi.baidu.com/sxch/blog/item/b727fc171e274703c93d6da0.html 
在MFC应用程序的客户区绘图时我们经常将绘图代码写到OnDraw 函数中,但是接触到Windows编程后我们通常要响应WM_PAINT消息来绘图,那到底WM_PAINT和OnDraw函数有什么关系呢?
首先,在MFC应用程序中,WM_PAINT消息对应的消息处理函数是OnPaint()函数,当用户改变视图以使得视图无效时,windows会发出WM_PAINT消息,然后OnPaint()函数予以相应。如果你没有为视图添加WM_PAINT的消息响应函数,那么它将使用CWND(甚至CVIEW)类的OnPaint函数,它的定义是这样的:

void CView::OnPaint() 

// standard paint routine 
CPaintDC dc(this); 
OnPrepareDC(&dc); 
OnDraw(&dc);       //自动调用OnDraw函数,所以用户一般只需要编写OnDraw
}

但是如果你在CXXXView类中添加了对消息WM_PAINT的响应,即为CXXXView类添加一个OnPaint()函数,这时即实现了多态,当视图改变时,将会调用子类的OnPaint函数,不会自动调用CView的OnPaint,从而你所写的OnDraw函数也不会被调用:

void CGLTestView::OnPaint() 
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here

// Do not call CView::OnPaint() for painting messages
}

此时你可以在OnPaint()中绘图,但是一般不这么做。
然而,在windows编程的时候是需要自己写消息循环的,所既没有OnPaint更不会有Ondraw,这时你的WinProc种swith-case结构中case WM_PAINT后的语句就相当于OnPaint函数,它负责视图无效后的重绘工作。



相关链接:http://blog.163.com/dzp_du812/blog/static/35511682200962744628120/