解决这类问题的方法,就是用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只加载了一次,就不会产生多图加载的闪烁问题