RECT rect;
HDC dc = GetWindowDC(_wndPic);
HDC memdc = CreateCompatibleDC(dc);
HDC imagedc = CreateCompatibleDC(dc);
GetClientRect(_wndPic, &rect);
int nWidth = rect.right - rect.left;
int nHeight = rect.bottom - rect.top;
HBRUSH hBrush = CreateSolidBrush(RGB(0,0,0));
HBITMAP bmp = ::CreateCompatibleBitmap(dc, nWidth, nHeight);
SelectObject(imagedc,bmp);
FillRect(imagedc,&rect,hBrush);
HGDIOBJ pOldBmp = SelectObject(memdc, *_image);
SetStretchBltMode(memdc, STRETCH_HALFTONE);
SetBkColor(memdc, RGB(255,0,0));
int x = (posx/10000.0 * nWidth);
int y = (posy/10000.0 * nHeight);
int cx = posw/10000.0 * nWidth;
int cy = posh/10000.0 * nHeight;
StretchBlt(imagedc,x,y,cx,cy,memdc,0,0,_image->GetWidth(),_image->GetHeight(),SRCCOPY);
//BitBlt(dc,0,0,nWidth,nHeight,imagedc,0,0,SRCCOPY);
StretchBlt(dc,0,0,nWidth,nHeight,imagedc,0,0,nWidth,nHeight,SRCCOPY);
SelectObject(dc,pOldBmp);
SetBkMode(dc,TRANSPARENT);
DeleteObject(dc);
DeleteDC(memdc);
ReleaseDC(_wndPic, dc);
在制作ppt播放器的过程中碰到了一个棘手的问题,就是第一次全屏显示一张图片之后,通过鼠标或者键盘变幻改图片大小的时候,就会出现背景图片没有被擦除的情况,后来自己就想了2中方案
方案1:每次在进行第二次贴图的时候,先把上一次的图片给擦除掉,但是没有找到很多好的方法
方案2:在每次贴图的时候,都先填充一下背景色,然后在贴上变幻大小之后的图片,于是就加了一句fillrect(dc,&rect,hhrush);虽然背景去掉了,但是会出现闪屏,后来查质料才发现原因在于,当想dc连续进行加载不同的资源,由于
颜色的反差,会出现闪屏,后来查找双缓存的资料,于是,就把上面的代码改为fillrect(memdc,&rect,hbrush);,结果上面都不显示,后来发现是少了 HBITMAP bmp = ::CreateCompatibleBitmap(dc, nWidth, nHeight);
SelectObject(imagedc,bmp);,就是内存dc,需要先设置一个memdc,然后向里面加载不同的资源,最后通stretchblt或者bitblt加载到外部设备dc上,这样才是完整的,
最后需要注意的是:多个叠加的内存资源加载外部dc上是尺寸是全屏的不在需要变幻了。。。