VC使用双缓存技术,解决闪屏问题

第一次写文章,有不对的地方请指正啊.. 双缓存:就是在内存中准备一块区域,把要显示的位图都加载到内存中,然后调用BitBlt函数,把内存设备复制到显示设备上,这样就可以防止闪屏了.. 下面是在VC中,实现的步骤..

1 新建一单文档MFC程序,取名为test1.

2在CTest1View中添加两个成员函数 void ShowBmpUseDbBuffer(); //用双缓存显示位图 void ShowBmp(); //没有使用双缓存就显示位图.. 添加一菜单命令,启动Timer,观察两种效果

 3 主要实现代码如下:

//使用双缓存技术,显示位图,防止闪屏
void CTest1View::ShowBmpUseDbBuffer()
{
	CDC *pDC = GetDC();	
	CBitmap BmpBack,BmpFront,BmpMem; //背景,前景,内存位图
	CDC BackDC,FrontDC,MemDC; //背景设备,前景设备,内存设备
	//创建与显示设备兼容的位图
	BmpMem.CreateCompatibleBitmap(pDC, 1024, 768);
	//加载位图
	BmpBack.LoadBitmap(IDB_BITMAP_BACK);
	BmpFront.LoadBitmap(IDB_BITMAP_FRONT);
	//创建与显示设备兼容的设备
	BackDC.CreateCompatibleDC(pDC);
	FrontDC.CreateCompatibleDC(pDC);
	MemDC.CreateCompatibleDC(pDC);
	//将位图选入设备
	MemDC.SelectObject(&BmpMem);
	BackDC.SelectObject(&BmpBack);	
	MemDC.BitBlt(0, 0, 1024, 768, &BackDC, 0, 0, SRCCOPY);
	//将前景位图选入设备
	FrontDC.SelectObject(&BmpFront);
	MemDC.BitBlt(0, 0, 1024, 768, &FrontDC, 0, 0, SRCCOPY);

	//只一次性的向显示设备显示位图,不会出现闪屏
	pDC->BitBlt(0, 0, 1024, 768, &MemDC, 0, 0, SRCCOPY);

	//释放资源
	pDC->DeleteDC();
	BackDC.DeleteDC();
	FrontDC.DeleteDC();
	MemDC.DeleteDC();
}
//没有使用双缓存技术,出现闪屏
void CTest1View::ShowBmp()
{
	CDC *pDC = GetDC();	
	CBitmap BmpBack,BmpFront; //背景,前景位图
	CDC BackDC,FrontDC; //背景设备,前景设备,内存设备
	//加载位图
	BmpBack.LoadBitmap(IDB_BITMAP_BACK);
	BmpFront.LoadBitmap(IDB_BITMAP_FRONT);
	//创建与显示设备兼容的设备
	BackDC.CreateCompatibleDC(pDC);
	FrontDC.CreateCompatibleDC(pDC);
	//将背景位图选入设备
	BackDC.SelectObject(&BmpBack);	
	pDC->BitBlt(0, 0, 1024, 768, &BackDC, 0, 0, SRCCOPY); //显示背景位图
	//将前景位图选入设备	
	FrontDC.SelectObject(&BmpFront);
	pDC->BitBlt(0, 0, 1024, 768, &FrontDC, 0, 0, SRCCOPY); //显示前景位图

	/************************
	 分两次的显示位图(先显示背景,再显示前景),
	 结果就出现了闪屏.
	**************************/
	
	//释放资源
	pDC->DeleteDC();
	BackDC.DeleteDC();
	FrontDC.DeleteDC();

}
 
//
//添加一菜单命令,启动一个Timer
void CTest1View::OnMenuitemStart() 
{
	// TODO: Add your command handler code here
	SetTimer(1,5,NULL);
}
//在OnTimer()函数中,查看两种效果
void CTest1View::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default	

	ShowBmpUseDbBuffer(); //使用双缓存技术,显示位图,防止闪屏

	//ShowBmp(); //没有使用双缓存技术,出现闪屏


	CView::OnTimer(nIDEvent);
}

程序下载地址:

http://download.csdn.net/source/472697

 

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值