最近在写一个基于MFC的OpenGL程序,涉及到动画,这就要求窗口能够随着时间的变化而重绘,在用OnDraw()函数进行OpenGL()绘图显示的时候,当窗口大小发生改变时,窗口中的内容会消失,当使用定时器进行动画生成时,也不能达到目的。

究其原因,OnDraw()函数并没有响应消息功能,当窗口大小改变、移动或者覆盖的时候,它并不能响应这些消息,对窗口进行重绘。下面简单描述一下OnDraw()和OnPaint()的区别。

首先我们需要了解,OnPaint()是CWnd的类成员,同时它也负责响应WM_PAINT消息,OnDraw()函数是CView的成员函数,CView又是CWnd的派生类。这也是,在默认的情况下视图类只有OnDraw()而没有OnPaint()的原因。

解决OnDraw()带来的问题有两个途径,一是在适当的地方调用InvalidateRect()函数对窗口进行强制重绘,在我的动画程序中,在设置定时器时对窗口进行了强制重绘。

void CExampleView::OnTimer(UINT_PTR nIDEvent) {  
// TODO: Add your message handler code here and/or call default 
if(i<200) i++;  
else i=0;  
InvalidateRect(NULL, FALSE);  
CView::OnTimer(nIDEvent); }  

另一个方法就是用ClassWizard添加WM_PAINT的响应函数OnPaint(),在OnPaint()内部进行作图,当窗口大小改变、移动或者覆盖的时候,它能响应这些消息,并对窗口进行重绘。