这个有弄啊,但是没效果,
而且我的InvalidateRect(NULL,false);已经设为false了,
看了网上的一些双缓存的代码,不知道是不是有问题,反正也还是会闪烁,
是不是我把绘制背景的放在OnPaint里的问题
有什么解决办法没?希望能给出较清晰的代码?

解决方案 »

  1.   

    dc.FillRect(rcclient, &brush); 
    是不是要写成memdc.FillRect(rcclient, &brush); memdc.SelectObject( &bitmap ); 
    选择了画完以后要选择回来
      

  2.   

    我觉得LZ的思路有点太对吧
    我认为, 从CStatic派生出一个CBitmapStatic类, 
    增加类成员HBITMAP m_hBitmap;
    把各种绘制在CBitmapStatic里面完成
    CTestDlg里面组织和管理各种位图, new CBitmapStatic等等
    CBitmapStatic 里面
    OnEraseBkgroud(...)
    return TRUE; 在OnPaint里面贴图, 用双缓冲, 应该不会闪烁的
      

  3.   

    楼书的问题我遇到过,后来解决了,这里有方法,http://www.99inf.net/SoftwareDev/VC/27107.htm,请参考。 
      

  4.   

    六楼的文章我早看过了,还没搞定,才来这问的,
    我的是用的CStatic控件来贴图的,背景图上还有不少这种贴图的,
    每一张图的绘制都是再void CTestDlg::DrawStaPic(CStatic* sta,HBITMAP& hBitmap)
    这个函数里进行的,再OnPaint里循环的进行所有图片的绘制的。只不过背景图绘制
    放在前面就是了。但是还是会闪烁。
      

  5.   

    双缓存指的是做两次缓存处理吧,你先把图片放入兼容DC1中,再将兼容DC1中的图片放入兼容DC2中,最后用BitBlt显示兼容DC2中的内容~~~
      

  6.   

    闪是因为:dc.FillRect(rcclient, &brush); 
    你改成:memdc.FillRect(rcclient, &brush); 
    看看效果!
      

  7.   

    memdc.FillRect(rcclient, &brush); 
    dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(), 
    &memdc, rcclient.left, rcclient.top,SRCCOPY); //SRCPAINT
    我改成了这样,效果还是一样闪烁。
      

  8.   

    代码思路有点乱,
    在画图的时候,你要记住:
    所以得东西都先在内存设备环境中化,画完后,然后用BitBlt拷贝到设备环境中。切忌不要
    一会在内存环境中画,一会又到设备环境中画。要么在内存设备环境中画然后拷贝的设备环境中
    ,要么就在设备环境中画。
      

  9.   

    把你重绘的地方InvalidateRect(NULL,false);替换为
    Static.GetParent()->RedrawWindow(&m_gbrect,NULL, RDW_INTERNALPAINT|RDW_INVALIDATE|RDW_UPDATENOW|RDW_ALLCHILDREN); //说明: 必须有父窗口,也就是你这里必须有背景图片 
    CRect m_gbrect; 为你的静态框相对背景图的rect, 
    你用GetWindowRect获取下背景图的rect以及静态框的rect自己计算下,代码如下类似: 
    CRect parentrect; 
    this->GetParent()->GetWindowRect(parentrect); 
    this->GetWindowRect(m_gbrect); 
    long tmpwidth = m_gbrect.Width(); 
    long tmpheight = m_gbrect.Height(); 
    m_gbrect.top = m_gbrect.top - parentrect.top;  
    m_gbrect.left = m_gbrect.left - parentrect.left; 
    m_gbrect.right = m_gbrect.left + tmpwidth; 
    m_gbrect.bottom = m_gbrect.top + tmpheight; 晕,刚好前几天我搞定了,你试试能用不
      

  10.   

    给你个双缓冲的步骤,按这个来应该没问题:1、创建内存DC(设备兼容DC),并选入供绘图的位图对象:
    m_memDC.CreateCompatibleDC(GetDC());
    m_bmp.CreateCompatibleBitmap(GetDC(),2000,2000);
    m_memDC.SelectObject(&m_bmp);

    DC的背景默认为黑色,可填充为屏幕默认背景色:
    m_memDC.FillSolidRect(0,0,2000,2000,GetSysColor(COLOR_BTNFACE));2、在内存DC上绘图,(选中的位图对象用来保存图像信息):
           就是你 DrawStaPic 里的绘图过程,把dc 和bitmap 替换一下3、将内存DC中的图片绘制到屏幕上,OnPaint里写:
    CDC *pdc = GetDC();
    pdc->BitBlt(0,0,430,420,&m_memDC, posx, posz,SRCCOPY);
      

  11.   

    dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(), 
    &memdc, rcclient.left, rcclient.top,SRCPAINT); 
    我觉得应该改成
    dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(), 
    &memdc, rcclient.left, rcclient.top,SRCCOPY); 试试 
    如果需要合并原位图 就合并了之后再用dc拷贝显示出来
      

  12.   

    CWnd::DefWindowProc(WM_PAINT, (WPARAM)memdc.m_hDC , 0); 
    问下这条语句是做什么用的,我这段代码是网上下的,但是把这句代码
    屏蔽了也没什么影响,所以感觉有点奇怪