MFC窗口的重绘:OnPanit()和OnDraw()的区别

最近在写一个基于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()内部进行作图,当窗口大小改变、移动或者覆盖的时候,它能响应这些消息,并对窗口进行重绘。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值