我想做一个人物下蹲的动画,按下一个键之后,开始连续显示蹲下的位图。
然后设置一个定时器:SetTimer(1,15,NULL);然后在网上查到了一个MFC GDI+双缓冲的方法。BOOL CGDIPtestDlg::OnEraseBkgnd(CDC* pDC)
{
return TRUE;    //将OnEraseBkgnd函数返回TRUE
}void CGDIPtestDlg::OnTimer(UINT_PTR nIDEvent)
{        KillTimer(1);

        CClientDC dc(this);
Graphics gra(dc.m_hDC); CRect rect;
GetClientRect(&rect); Bitmap bmp(rect.Width(),rect.Height()); //依窗口大小创建内存画布
Graphics buffer(&bmp);  //Gaphics对象引用内存画布
buffer.Clear(Color::White);  //清除内存画布并以白色填充 if(m_nSrcCrouchImageX>512)
{
m_nSrcCrouchImageX=448;  //m_nSrcCrouchImageX是源图的X坐标
}

buffer.DrawImage(m_pBitmap ,100, 150, m_nSrcCrouchImageX, 0, 64, 64, UnitPixel);  //在内存画布中绘画        //100和150是画在对话框中的坐标
        //m_pBitmap是对话框类的一个成员,类型是 Bitmap,载入的是一张png格式的位图。
        //64是每一张小图的宽和高,源图是由8张64×64的图组成的一张512×64的大图。 gra.DrawImage(&bmp, 0, 0);  //将内存画布贴到屏幕
m_nSrcCrouchImageX+=64; //源图的X+64,画下一张小图 CDialog::OnTimer(nIDEvent);
}源图大概是这样的。
用了这个方法后,显示的图还是会闪烁。
求解决方法。另外,我在http://hi.baidu.com/k273811702/item/443b275915f573ded48bac2b看到了另一种解决闪烁的问题,用的是CMemDC类。
它其中有一段语句是:void CExampleView::OnDraw(CDC* dc)
{
    CMemDC pDC(dc);
    CExampleDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here - use pDC
     //as the device context to draw to
}可惜我是基于对话框编程,没有Doc类,所以OnDraw里的我这段代码没写。
然后运行的结果还是闪烁。求前辈们指导怎么解决闪烁问题。gdi+mfc双缓冲