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::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(); }
view plaincopy to clipboardprint?
//没有使用双缓存技术,出现闪屏 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::OnMenuit