我想做一个人物下蹲的动画,按下一个键之后,开始连续显示蹲下的位图。
然后设置一个定时器: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双缓冲
然后设置一个定时器: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双缓冲
if(m_nSrcCrouchImageX>512)这里的值不对。
因为到448的时候,就已经显示最后一张图了,+64=512时,是没有图的。
所以会显示空白,我的语句是大于512才会回到蹲下的最后一张图。
只要把512改成448就不会闪烁了。结贴吧。