先纠正昨天的一个小错误~昨天我们判断蛇挂了 用了一个m_arrGameRange[itHead->nCol][itHead->nRow] != 0 有朋友指出 说吃到食物也不等于0 对 昨天漏写了 && m_arrGameRange[itHead->nCol][itHead->nRow] != 2 

在之前的文章里面,我们已经实现了简单的贪吃蛇,但是 细心的朋友可能会发现,我们的贪吃蛇有点闪~ 那是因为我们绘图的时候没用使用双缓冲,至于什么是双缓冲 这个概念我们就不提了,大家可以百度一下,我们只要知道 加了双缓冲 就不会闪屏了,那么MFC是怎么实现双缓冲的呢  我们平时绘图 是直接用DC就开始画 而双缓冲,需要先创建一张位图,在位图画好了以后,再把图贴到界面上 这样就避免了重复贴图

一般使用双缓冲的代码大概是这样

CRect rc;//用来获取窗口矩形区域的大小
	CDC dcMem;//用来在位图上画图的DC
	GetClientRect(&rc);//获取窗口大小
	CBitmap bmp;//我们画图的位图

	dcMem.CreateCompatibleDC(pDC);//创建一个兼容DC
	bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());//创建一个兼容的DC,以后画图就直接画在我们的位图上
	CBitmap *pOldBit = dcMem.SelectObject(&bmp);//把我们的位图选到兼容DC里面去
	/*
	画图的代码
	*/
	
	pDC->BitBlt(0,0,rc.Width(),rc.Height(),&dcMem,0,0,SRCCOPY);//把在位图上画的图贴到我们的真正的DC上面去
	
	//释放资源的代码
	dcMem.SelectObject(pOldBit);
	dcMem.DeleteDC();
	bmp.DeleteObject();

如果在我们的贪吃蛇项目中要使用的话,我们在onpaint里面吧这段代码复制进去,把我们画的函数 写在

/*
	画图的代码
	*/

这个注释的地方,最后 传DC的时候传我们的兼容DC最终代码如下

void CSnakeDlg::OnPaint()
{
	CPaintDC dc(this); // 用于绘制的设备上下文

	CRect rc;//用来获取窗口矩形区域的大小
	CDC dcMem;//用来在位图上画图的DC
	GetClientRect(&rc);//获取窗口大小
	CBitmap bmp;//我们画图的位图

	dcMem.CreateCompatibleDC(&dc);//创建一个兼容DC
	bmp.CreateCompatibleBitmap(&dc, rc.Width(), rc.Height());//创建一个兼容的DC,以后画图就直接画在我们的位图上
	CBitmap *pOldBit = dcMem.SelectObject(&bmp);//把我们的位图选到兼容DC里面去

	DrawGameRange(dcMem);
	DrawSnake(dcMem);

	dc.BitBlt(0, 0, rc.Width(), rc.Height(), &dcMem, 0, 0, SRCCOPY);//把在位图上画的图贴到我们的真正的DC上面去

																	  //释放资源的代码
	dcMem.SelectObject(pOldBit);
	dcMem.DeleteDC();
	bmp.DeleteObject();


	CDialogEx::OnPaint();
}

完整代码下载 (工程需要VS2012及2012以上的版本才能打开)

http://www.dbgpro.com/wp-content/uploads/2016/11/Snake.zip

打赏