背景图是动态导入的,在一个文件夹中有很多可选的,当我不导背景的时候,拖动图元很正常,可是导入背景图后拖动图元旧的不擦除。我为了让画上去的图在背景滚动的时候不闪烁,就把背景和画上去的图放在同一个内存DC里的,却导致拖动图元不能擦除。贴上部分代码:当我动态选择背景图之后HBITMAP m_hBmpTemp保存了选择的背景图,然后ExistBK=TRUE;
在OnPaint中:
   CPaintDC dc(this);
   Redraw();
   CDialog::OnPaint();在自定义的Redraw()中:
CDC *pDC=GetDC();
    CDC MemDC;    
    CRect rcclient;
    GetClientRect(&rcclient);
    MemDC.CreateCompatibleDC( pDC);
    if (ExistBK==TRUE)//当有背景图的时候
    {
        if (bk_flag==1)
        {
            VERIFY(m_hBmpOld = (HBITMAP)SelectObject(MemDC,m_hBmpTemp) );
            bk_flag=0;
        }
        else
        {
            SelectObject(MemDC,m_hBmpTemp);
        }        
        
        for (int i=0;i<ptrArray.GetSize();i++)
        {
            ((PicElement *)ptrArray.GetAt(i))->DrawElement(&MemDC);//ptrArray保存了我画上去的所有图
        }//offsetx,offsety,m_size.cx,m_size.cy, sourcex, sourcey都是跟滚动相关的
        pDC->BitBlt(offsetx,offsety,m_size.cx,m_size.cy, &MemDC, sourcex, sourcey,SRCCOPY);        
        erase=false;
        
        MemDC.DeleteDC();
    }    else //没有背景图时,背景色是白色
    {
        CBitmap MemBitmap;
        MemBitmap.CreateCompatibleBitmap(pDC,rcclient.right,rcclient.bottom);
        CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
        MemDC.BitBlt(rcclient.left,rcclient.top,rcclient.right,rcclient.bottom,pDC,0,0,SRCCOPY);
        for (int i=0;i<ptrArray.GetSize();i++)
        {
            ((PicElement *)ptrArray.GetAt(i))->DrawElement(&MemDC);
        }
        
        pDC->BitBlt(rcclient.left,rcclient.top,rcclient.right,rcclient.bottom,&MemDC,0,0,SRCCOPY);
        MemDC.SelectObject(pOldBit);
        MemBitmap.DeleteObject();
        MemDC.DeleteDC();
    }    ReleaseDC(pDC);在OnEraseBkgnd()中:
if (erase)
    {
        return TRUE;
    }
    else
    {
        CRect rcClient;
        GetClientRect(&rcClient);
        rcClient.bottom-=(TOOLBAR_HEIGHT);
        pDC->FillRect(&rcClient,&m_brBk);//m_brBk是个白色的画刷,为了最开始能显示白色背景
        return TRUE;
    }

解决方案 »

  1.   

    背景和图元画在memdc上没什么问题,关键是你拖动的图元不应该画在memdc上吧,我认为你应该另外再弄一个drawMemDc出来,拖动的时候,先将包括背景和图元的memdc在drawMemDC刷一遍,然后再将你拖动的图元画在drawMemDc上,最后显示的时候应该用drawMemDC,而不是用memdc。
      

  2.   

    关于拖动你可以看看这个
    http://blog.csdn.net/xianglitian/archive/2010/11/20/6023656.aspx
      

  3.   

    有背景时你少一句把背景图像画在MemDC里的语句
      

  4.   

    当我动态选择背景图之后HBITMAP m_hBmpTemp保存了选择的背景图,然后ExistBK=TRUE;if (bk_flag==1)
            {
                VERIFY(m_hBmpOld = (HBITMAP)SelectObject(MemDC,m_hBmpTemp) );
                bk_flag=0;
            }
            else
            {
                SelectObject(MemDC,m_hBmpTemp);
            } 
    这里就画了背景了
      

  5.   

    背景和图元一起画就不会闪烁了。将背景和图元画到同一内存dc上,然后bitblt到窗口DC
      

  6.   


    这个只是选进来,不算画,画是类似BitBlt或StretchDiBits那种
      

  7.   

    我选进来了背景也显示了呀,还要怎么画?BitBlt什么?能举个例子跟我说下吗?谢啦
      

  8.   

           if (bk_flag==1)
            {
                VERIFY(m_hBmpOld = (HBITMAP)SelectObject(MemDC,m_hBmpTemp) );
                bk_flag=0;
            }
    这句改为:
           if (bk_flag==1)
            {
                VERIFY(m_hBmpOld = (HBITMAP)SelectObject(pDC->GetSafeHdc(),m_hBmpTemp) );
                MemDC.BitBlt(rcclient.left,rcclient.top,rcclient.right,rcclient.bottom,pDC,0,0,SRCCOPY);
                bk_flag=0;
            }这样试过没
      

  9.   


    试过了,还是不行,跟我的MOUSEMOVE的代码有关吗?为什么不导背景的时候是正常的
      

  10.   

    你没背景时的这句话
    MemDC.BitBlt(rcclient.left,rcclient.top,rcclient.right,rcclient.bottom,pDC,0,0,SRCCOPY);
    相当于刷新而你在画有背景时,没有这种刷新,所以就会导致重叠