双缓冲解决界面中图片较多引起的图片闪烁问题

 

解决这类问题的方法,就是用2个DC!

 

CDC *pDC = this->GetDC();
 CRect rc;
 this->GetClientRect(&rc);

 

CBitmap*   pcBmp;
 BITMAP bmp;
 CDC memDC;
 memDC.CreateCompatibleDC(pDC);

 

    CDC DcMemory; //建立内存缓冲
 DcMemory.CreateCompatibleDC(pDC);//复制界面的DC  
    CBitmap   membmp; 

membmp.CreateCompatibleBitmap(pDC,rc.right,rc.bottom);//建立一张空的位图,好作为内存缓冲的底图
    DcMemory.SelectObject(&membmp);   //将图片加入到内存缓冲Dc中
 DcMemory.FillSolidRect(0,0,rc.right,rc.bottom,RGB(255,255,255));//一定记得给底图填色阿...要不就花了....
    DcMemory.SetBkMode(TRANSPARENT);
    DcMemory.SetTextColor(RGB(255,0,0));

 

pcBmp   =   CBitmap::FromHandle(imageCtrlDate.ImageList[i]);
  pcBmp->GetBitmap(&bmp);

  memDC.SelectObject(pcBmp); 
  SetStretchBltMode(pDC->m_hDC,BLACKONWHITE);

//重要的其实在下边,将加载图片的Dc贴图到另一个内存DC中
  StretchBlt(DcMemory,left,top- ScrollPos,PHOTO_WIDTH,PHOTO_HEIGH,memDC,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);

//最后全部贴完后将准备好的Dc贴到实际的dc中去,完成绘图

pDC->BitBlt(0,0,rc.right,rc.bottom,&DcMemory,0,0,SRCCOPY);

 

 

实际就是将需要的图片先都加载到一个内存dc上去,这个dc模拟了真正的设备dc,然后需要的图片都添加完成后,再将内存dc贴到实际dc上去,这样虽然图片很多,但实际设备dc只加载了一次,就不会产生多图加载的闪烁问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值