制作ppt视频播放器的过程中对双缓存的有效应用

最近在做一个ppt的播放器工具,要求是能够通过鼠标或键盘的相关消息实现对图片的远程控制,在后期的修改过程中一直会出现的一个问题是,当在变幻图片大小的时候会出现上一次图片的背景一直存在的问题,

 

现在详细描述下这个问题:首先我的标准是以屏幕为基准,那么开始状态下图片都会全屏覆盖。

 

最开始我解决背景的问题是采取先想destdc中填充背景颜色,然后用stretchblt将变幻后的图片加载到destdc上,但是后来才知往目标dc上连续两次加载不同颜色的图片,由于颜色的反差会出闪屏,这个和实验结果吻合,后来我在想怎样不用填充,就是说在第二次加载图片之前把destdc上的内容给清空掉,但是找了好久没有找到合适的方法,所以在此查找资料,发现双缓存的问题。。。先理一下思路,双缓存(个人理解)如果要往destdc连续加载位图或其他图的资源的话,可以通过这种方式,把所有要加载的资源全部都加载到memdc中,然后最后在一次加载到destdc上,当认识到这一步的时候,fillrect中的dc改为了memdc(整个屏幕的填充),让后再用stretchblt讲指定bitmap加载到memdc1中,最后再次用stretchblt将memdc1加载到memdc2中(此时的参数尺寸都是全屏,不用变幻)。。发现根本什么都不显示,于是再次思考,后来看到有代码写到在最开始需要定义一个空的dc于是加了一句 HBITMAP bmp = ::CreateCompatibleBitmap(dc, nWidth, nHeight); SelectObject(imagedc,bmp);效果出来了,所以问题就出在这里了。。。到这里闪屏和背景的问题都解决了。。。

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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值