可能都会以为是以前大多的那种图形防闪的问题.请听我讲完全 这是一个等待解决的问题!CClientDC dc(this);
CRect rect;
GetWindowRect(&rect);//取得窗体大小SelectObject(MDC,BG);
BitBlt(dc.m_hDC,0,0,rect.Width(),rect.Height(),MDC,bgx,bgy,SRCCOPY);//在窗体上画出背景SelectObject(MDC2,BG2);
BitBlt(dc.m_hDC,rect.Width()/2,rect.Height()/2,32,32,MDC2,0,0,SRCCOPY);//在屏幕中间画出前景这些代码我都是放在OnTimer()中 不断增加bgx与bgy的值 但背景重画产生移动画面的时候 前景闪烁的厉害 原理都知道 因为重画了背景 再画前景 前景会短暂地被前景覆盖掉一断时间 然后再画出前景.初步想法是计算出前景的位置 在第一次画背景的时候跳过前景坐标的重画 就不会覆盖前景.能不能有更好的方法?使之不再闪烁?

解决方案 »

  1.   

    双缓冲!!先在内存绘制好了在copy显示
      

  2.   

    慢、吃资源都是其次考虑的优化问题;但是确实应该用双缓冲;至少需要3个内存DC,一个是所谓的Offscreen DC,一个是背景DC,一个是前景,先把背景绘制到Offscreen DC,再绘制前景到Offscreen DC,然后把Offscreen DC绘制到窗口上。当然这中间有很多优化可作,这是后话了。
      

  3.   

    以资源换速度,把DC作为全局变量保存起来,前景图和背景图都放在这个DC里,不用每次都selectobject,这样速度会快些
      

  4.   

    一点是明确的,应该使用内存DC,等把所有图都贴到内存DC后再把内存DC BLT到dc上.不过如果背景图片不常更改的话可以考虑将背景图片的代码防在ERASEBKGROUND 里,这样应该会有效果
      

  5.   

    我现在多对经常用的背景画好后存为HBITMAP,这样就可以经常用,而不用去重复画( 当然更新界面大小等情况再去重新画一下)
      

  6.   

    思路都是一样的大家 都是至少3个内存DC 一个存背景图形 一个存前景图形 一个用来临时存入新的图形 再画到目标DC上显示出来是吧.这个我早就试过了 效果是不错 但是 我有N个 前景对象 每个对象不停地运动 这样来说的话 在定时器中 就要循环N次 来运动这N个对象 就要在内存中重画N次 贴图N次.最后出来的效果可想而知 闪得更厉害...两个以上前景对象就会闪.
    看来仍是不能完美解决.
      

  7.   

    呵 解决了! 在一开始就画将背景画在临时内存中 然后中间所有要改变的图形 区域 经过复杂计算之后再画到临时内存中作为前景 最后将这个临时内存中的图形画到目标DC上...谢谢大家的回答 你们的每个回复都对我有帮助.感谢  Mackz(在相互) 对我的每个问题都有参与 谢谢!