MFC 双缓冲技术

之前做五子棋用过双缓冲,没有记下,现在做飞行棋又用到了双缓冲技术,现在把这个记下来.

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);


这样在显示的时候就不会出现闪烁的情况了.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值