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




//在OnTimer()函数中,查看两种效果
void CTest1View::OnTimer(UINT nIDEvent) 
{
// TODO: Add your message handler code here and/or call default


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


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




CView::OnTimer(nIDEvent);
}

转自:

http://blog.csdn.net/lizhigang34/article/details/2491594

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值