双缓冲技术的一个冲突,请大家帮忙

litingli 2008-05-25 02:21:10
最近在做一个小游戏,为了避免闪烁,我在OnEraseBkgnd()和OnDraw()都使用了双缓冲技术,这两者同时使用的话会引起很大的闪烁,单独使用不会,有没有什么解决方案?下面是源码:
-----OnDraw(CDC *pDC)-------
void GameView::OnDraw(CDC* pDC)
{
//ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CRect rc;
GetClientRect(&rc);

CBitmap* m_pOldBitmap;
CBitmap m_pMemBitmap; //声明内存中承载临时图象的位图
CDC m_pMemDC; //声明用于缓冲作图的内存m_pMemDC
m_pMemDC.CreateCompatibleDC(pDC);
m_pMemBitmap.CreateCompatibleBitmap(pDC, rc.Width(), rc.Height());
m_pOldBitmap = m_pMemDC.SelectObject(&m_pMemBitmap);
CBrush brush1;
brush1.CreateSolidBrush(RGB(255,255,255));
m_pMemDC.FillRect(rc,&brush1);

………………

pDC->BitBlt(0,0,rc.Width(),rc.Height(),&m_pMemDC,0,0,SRCCOPY); m_pMemDC.SelectObject(m_pOldBitmap);
m_pMemBitmap.DeleteObject();
m_pMemDC.DeleteDC();
}
-----------OnEraseBkgnd------------
BOOL GameView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
int nWidth;
int nHeight;
CRect rect;
GetWindowRect(&rect);
nWidth = rect.Width();
nHeight= rect.Height();

CDC MemDC;
CBitmap MemBitmap;
MemDC.CreateCompatibleDC (pDC);
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));

GetClientRect(&rect);
BITMAP bm;
CDC dcMem;
//game.back是Cbitmap对象
VERIFY(game.back.GetObject(sizeof(bm),(LPVOID)&bm));
dcMem.CreateCompatibleDC(pDC);
CBitmap *pOldBMP =( CBitmap *)dcMem.SelectObject(&game.back);
MemDC.BitBlt( 0,0,bm.bmWidth,bm.bmHeight,&dcMem,0,0,SRCCOPY);
dcMem.SelectObject(pOldBMP);

pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);
MemBitmap.DeleteObject();
MemDC.DeleteDC();
return true;//CView::OnEraseBkgnd(pm_pMemDC);;
}
...全文
70 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
litingli 2008-07-22
  • 打赏
  • 举报
回复
那你的意思是在构造函数中创建DC么?

嗯,我想我的问题可能没给大家说清楚,我的双缓冲问题是解决了的,游戏运行没闪了,我奇怪的是在OnEraseBkgnd中添加那串代码之后为什么闪烁得更厉害了。

非常感谢你^^
litingli 2008-07-22
  • 打赏
  • 举报
回复
虽然你没说得很清楚,但是还是非常感谢哈
litingli 2008-07-22
  • 打赏
  • 举报
回复
谢谢,这个我知道,呵呵
liyinlei 2008-05-26
  • 打赏
  • 举报
回复
在OnDraw里频繁的创建和释放内存DC,双缓冲的效果毁了大半。

应该将绘制与创建内存DC分离。内存DC只需初始创建最终结束是释放即可,在需要重绘的地方调用绘制函数。


在 OnEraseBkgnd 里只要return TRUE就可以了,只是进行背景擦除的工作。干嘛又做绘制的工作?
aa3000 2008-05-26
  • 打赏
  • 举报
回复
不要在背景画了,在OnDraw一起画吧
菜牛 2008-05-25
  • 打赏
  • 举报
回复
BOOL GameView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return true;//CView::OnEraseBkgnd(pm_pMemDC);;
}

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧