之前做五子棋用过双缓冲,没有记下,现在做飞行棋又用到了双缓冲技术,现在把这个记下来.
void CProgramView::PrintAll(CDC *pdc)
{
CRect rc;
CDC dcMem;
GetClientRect(&rc);//获取用户区坐标
CBitmap bbmap;
dcMem.CreateCompatibleDC(pdc);//内存DC与显示DC兼容
bbmap.CreateCompatibleBitmap(pdc,800,600);
CBitmap *pOldBit=dcMem.SelectObject(&bbmap);
dcMem.FillSolidRect(rc,RGB(255,255,255));
PrintBG(&dcMem);
//便历所有16架飞机
int i;
for(i=0;i<=15;i++)
{ if(plthis[i].state==0)//如果该飞机仍然在飞机场,或者被打了回去
Drawback(i,plthis[i],&dcMem);
else
Drawplane(plthis[i],&dcMem);//如果该飞机处于1~4状态
}
dcMem.DeleteDC();
}
这是我的飞行棋代码中的一小段,主要作用是绘制所有飞机和背景图.(图片都已在头文件中初始化)
第一步是定义一个与显示DC兼容的内存DC,为dcMem
第二步是将图片都绘制到内存DC dcMem中,用的是函数PrintBG、Drawback与Drawplane,传入的参数是dcMem的地址
以下为其中一个函数的代码:
void CProgramView::PrintBG(CDC* dcMem)
{
dcMem->BitBlt(0,0,1000,900,&Background,0,0,SRCCOPY);
}
这个函数比较简单.
第四步就是将内存DC的内容绘制到显示DC中了,用到了pdc->BitBlt(0,0,800,600,&dcMem,0,0,SRCCOPY);
这样在显示的时候就不会出现闪烁的情况了.