stretchblt、bitblt对双缓存的应用

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上是尺寸是全屏的不在需要变幻了。。。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值