CImage 缩放闪烁问题困扰

liangyuegang 2013-11-30 01:08:33
void CZYDBMSView::OnDraw(CDC* pDC)
{
CZYDBMSDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;

// TODO: 在此处为本机数据添加绘制代码
if(pDoc->m_picture.IsNull())
pDoc->m_picture.Load(_T("D:\\3525.00-475.00.jpg"));
SetStretchBltMode(pDC->m_hDC,HALFTONE);
SetBrushOrgEx(pDC->m_hDC,0,0,NULL);
int imgW=pDoc->m_picture.GetWidth();
int imgH=pDoc->m_picture.GetHeight();
int width=imgW*m_zoomindex;
int height=imgH*m_zoomindex;//缩放后长宽
CRect rect;
GetClientRect(&rect);
CImage memimg; //创建CImage缓存
memimg.Create(imgW,imgH,pDoc->m_picture.GetBPP());
HDC tmpdc = memimg.GetDC();
CDC memDC;
memDC.Attach(tmpdc);

memDC.FillSolidRect(rect, RGB(255, 255, 255));
pDoc->m_picture.Draw(tmpdc,0,0,imgW,imgH);

memimg.Draw(pDC->m_hDC,0,0,width,height); //将CImage缓存贴到dc上
memDC.Detach(); //释放这两个,不释放crash
memimg.ReleaseDC();
}
这样处理后依然闪烁,加载的图片大小为3M,CImage 双缓存避免闪烁 是这样使用的吗,在网上也看到一些类似用法,但都没能满意解决问题,双缓存到底怎么使用,请各位高手指教。
...全文
250 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldy 2013-11-30
  • 打赏
  • 举报
回复
当memDC->pDC 的时候,pDC的窗口内容就全部被覆盖,所以pDC的擦除背景是毫无意义的
liangyuegang 2013-11-30
  • 打赏
  • 举报
回复
引用 3 楼 worldy 的回复:
怎么可能?你使用内存dc烤进去,不就全部重新覆盖了
你说的是这个意思吗,memDC.FillSolidRect(rect, RGB(255, 255, 255));不是很懂,能说的详细一点吗
worldy 2013-11-30
  • 打赏
  • 举报
回复
怎么可能?你使用内存dc烤进去,不就全部重新覆盖了
liangyuegang 2013-11-30
  • 打赏
  • 举报
回复
引用 1 楼 worldy 的回复:
刷新的时候禁止擦除背景,刷新时,擦除背景是闪烁的元凶
若不刷新背景 在函数OnEraseBkgnd(CDC* pDC)里 直接返回TRUE,那屏幕上面就乱了啊
worldy 2013-11-30
  • 打赏
  • 举报
回复
刷新的时候禁止擦除背景,刷新时,擦除背景是闪烁的元凶

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧