我使用ScrollView,然后使用双缓存的方式画图,当我拖动滚动条的时候,图形重叠到
一块了,这个问题如何解决呢?
下面是我的代码,请帮帮我!CTestView::CTestView()
{
// TODO: add construction code here
    m_pMemoryDC=new CDC;
    m_pBitmap=new CBitmap;
}/////////////////////////////////////////////////////////////////////////////
// CTestView drawingvoid CTestView::OnDraw(CDC* pDC)
{
CSize sizeTotal;
sizeTotal.cx=1000;
sizeTotal.cy=5000;
SetScrollSizes(MM_TEXT, sizeTotal);


CRect rect;
CPoint ScrollPoint=GetScrollPosition();
TRACE("滚动位置:x=%d,y=%d\n",ScrollPoint.x,ScrollPoint.y);

GetClientRect(&rect);

m_pMemoryDC->CreateCompatibleDC(pDC);
m_pBitmap->CreateCompatibleBitmap(pDC,rect.right+1,rect.bottom+1);
CBitmap * pOldbmp=m_pMemoryDC->SelectObject(m_pBitmap);
m_pMemoryDC->SelectStockObject(WHITE_BRUSH);
m_pMemoryDC->Rectangle(0,0,rect.right,rect.bottom);
m_pMemoryDC->SelectStockObject(NULL_BRUSH); m_pMemoryDC->MoveTo(0,0);
m_pMemoryDC->LineTo(1000,5000);
pDC->BitBlt(ScrollPoint.x,ScrollPoint.y,
ScrollPoint.x+rect.right,
ScrollPoint.y+rect.bottom,
m_pMemoryDC,0,0,SRCCOPY);

m_pMemoryDC->SelectObject(pOldbmp);
m_pBitmap->DeleteObject();
m_pMemoryDC->DeleteDC();}
BOOL CTestView::OnEraseBkgnd(CDC* pDC) 
{
// TODO: Add your message handler code here and/or call default

return CScrollView::OnEraseBkgnd(pDC);
}void CTestView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
// TODO: Add your message handler code here and/or call default
CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
}void CTestView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
// TODO: Add your message handler code here and/or call default

CScrollView::OnHScroll(nSBCode, nPos, pScrollBar);
}

解决方案 »

  1.   

    在你涉及画图的地方调用:
    OnPrepareDC(&dc);
      

  2.   

    我现在就是在OnDraw里面画图,使用m_pMemoryDC->CreateCompatibleDC(pDC)产生的m_pMemoryDC,该如何改呢?
      

  3.   

    void CTestView::OnDraw(CDC* pDC)
    {
    CSize sizeTotal;
    sizeTotal.cx=1000;
    sizeTotal.cy=5000;
    SetScrollSizes(MM_TEXT, sizeTotal);//在这里调用是不合理的 OnPrepareDC(m_pMemoryDC);//增加这一句 CRect rect;
    CPoint ScrollPoint=GetScrollPosition();
    TRACE("滚动位置:x=%d,y=%d\n",ScrollPoint.x,ScrollPoint.y);

    GetClientRect(&rect);         m_pMemoryDC->LPtoDP(rect);//增加这一句
    m_pMemoryDC->CreateCompatibleDC(pDC);
    m_pBitmap->CreateCompatibleBitmap(pDC,rect.right+1,rect.bottom+1);
    CBitmap * pOldbmp=m_pMemoryDC->SelectObject(m_pBitmap);
    m_pMemoryDC->SelectStockObject(WHITE_BRUSH);
    m_pMemoryDC->Rectangle(0,0,rect.right,rect.bottom);
    m_pMemoryDC->SelectStockObject(NULL_BRUSH); m_pMemoryDC->MoveTo(0,0);
    m_pMemoryDC->LineTo(1000,5000);//这里也可能要转一下
    pDC->BitBlt(ScrollPoint.x,ScrollPoint.y,
    ScrollPoint.x+rect.right,
    ScrollPoint.y+rect.bottom,
    m_pMemoryDC,0,0,SRCCOPY);

    m_pMemoryDC->SelectObject(pOldbmp);
    m_pBitmap->DeleteObject();
    m_pMemoryDC->DeleteDC();}
      

  4.   

    //坐标变换需要看你要做什么而定的,现在很难猜测怎么变换,再试试这个
    void CTestView::OnDraw(CDC* pDC)
    {
    CSize sizeTotal;
    sizeTotal.cx=1000;
    sizeTotal.cy=5000;
    SetScrollSizes(MM_TEXT, sizeTotal);//在这里调用是不合理的 OnPrepareDC(m_pMemoryDC);//增加这一句 CRect rect;
    CPoint ScrollPoint=GetScrollPosition();
    TRACE("滚动位置:x=%d,y=%d\n",ScrollPoint.x,ScrollPoint.y);

    GetClientRect(&rect);         m_pMemoryDC->LPtoDP(rect);//增加这一句
    m_pMemoryDC->CreateCompatibleDC(pDC);
    m_pBitmap->CreateCompatibleBitmap(pDC,rect.right+1,rect.bottom+1);
    CBitmap * pOldbmp=m_pMemoryDC->SelectObject(m_pBitmap);
    m_pMemoryDC->SelectStockObject(WHITE_BRUSH);
    m_pMemoryDC->Rectangle(0,0,rect.right,rect.bottom);
    m_pMemoryDC->SelectStockObject(NULL_BRUSH);         CPoint ptStart(0,0),ptEnd(1000,5000);
             m_pMemoryDC->LPtoDP(ptStart);//增加这一句
             m_pMemoryDC->LPtoDP(ptEnd);//增加这一句         
    m_pMemoryDC->MoveTo(ptStart);//更改
    m_pMemoryDC->LineTo(ptEnd);//更改 pDC->BitBlt(ScrollPoint.x,ScrollPoint.y,
    ScrollPoint.x+rect.right,
    ScrollPoint.y+rect.bottom,
    m_pMemoryDC,0,0,SRCCOPY);

    m_pMemoryDC->SelectObject(pOldbmp);
    m_pBitmap->DeleteObject();
    m_pMemoryDC->DeleteDC();}
      

  5.   

    谢谢,问题解决了,下面是我的OnDraw里面的代码 CDC MemDC; //首先定义一个显示设备对象
    CBitmap MemBitmap;//定义一个位图对象

    MemDC.CreateCompatibleDC(pDC);
    MemBitmap.CreateCompatibleBitmap(pDC,1000,5000);
    CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
    MemDC.FillSolidRect(0,0,1000,5000,RGB(0,20,255));
    MemDC.Rectangle(100,100,200,200);
    MemDC.Rectangle(800,3000,900,3100);
    pDC->BitBlt(0,0,
    1000,
    5000,
    &MemDC,0,0,SRCCOPY);
         //绘图完成后的清理
    MemBitmap.DeleteObject();
    MemDC.DeleteDC();然后把OnEraseBkgnd改为return TRUE我的想法是创建的内存图片大小是设置的滚动视图的大小,而不是屏幕的大小
    然后再画图过程中,我可以随便画在超出屏幕大小的范围,然后使用Bitblt拷贝的时候,要拷贝滚动试图的大小,而不是窗口的大小,这样我就不需要判断当前滚动条的位置了,当然,这种方法比较浪费资源,不过我觉得条理还是比较清晰的,如果使用ScrollView滚动有问题的朋友可以考虑使用这种方法,谢谢大家的回答!