单文档视图结构,在视图中显示了图片,在图片大小超过视图时,需要拖动滚动条或鼠标查看,
可是在拖动时会出现闪烁情况,请问此情况该如何解决,最好给个例子~谢谢~~

解决方案 »

  1.   

    BOOL CYourView::OnEraseBkgnd (CDC* pDC )
    {
        return TRUE;
    }另外注意如果图片比视图小的时候要填充额外的空隙
      

  2.   

    注意在OnDraw里面判断.即使未读入图片.也要自己使用双缓存画背景.
    1句话.双缓存.
      

  3.   

    双缓存。
    OnEraseBkgnd 里return true。这样九可以了。
      

  4.   

    ***View头文件中,声明几个成员变量
    class C***View : public CView
    {
    ......
         protected:
    CBitmap* m_pBitmap;
    CDC  *   m_pdcMemory;
    CRect  m_clientRect;
    ......
    }***View.cpp文件中用“Ctrl+W”给C***View类添加WM_PAINT消息映射函数OnPaint和OnInitalUptade成员函数。构造函数和析构函数如下:C***View::CImageView()
    {
       // TODO: add construction code here
        m_pdcMemory = new CDC;
        m_pBitmap   = new CBitmap;

    }C***View::~CImageView()
    {
        delete m_pBitmap; // already deselected
        delete m_pdcMemory;
    }OnInitialUpdate() 和OnPaint()
    void C***View::OnInitialUpdate() 
    {
        CView::OnInitialUpdate();

        // TODO: Add your specialized code here and/or call the base class
        CSize sizeTotal(1800, 1050);
        // creates the memory device context and the bitmap
        if (m_pdcMemory->GetSafeHdc() == NULL) 
        {
            CClientDC dc(this);
            OnPrepareDC(&dc);
            CRect rectMax(0, 0, sizeTotal.cx, sizeTotal.cy);
            m_pdcMemory->CreateCompatibleDC(&dc);
            // makes bitmap same size as display window
            m_pBitmap->CreateCompatibleBitmap(&dc, rectMax.right,rectMax.bottom);
        }
    }void C***View::OnPaint() 
    {
       C***Doc * pDoc=GetDocument();
       CPaintDC dc(this); // device context for painting
       OnPrepareDC(&dc);
        CRect rectUpdate;
        dc.GetClipBox(&rectUpdate);
        CBitmap* pOldBitmap = m_pdcMemory->SelectObject(m_pBitmap);
        m_pdcMemory->SelectClipRgn(NULL);
        m_pdcMemory->IntersectClipRect(&rectUpdate);
        CBrush backgroundBrush((COLORREF) ::GetSysColor(COLOR_WINDOW));
        CBrush* pOldBrush = m_pdcMemory->SelectObject(&backgroundBrush);
        m_pdcMemory->PatBlt(rectUpdate.left, rectUpdate.top,
    rectUpdate.Width(), rectUpdate.Height(),
    PATCOPY); 

        OnDraw(m_pdcMemory);///////OnDraw()这个函数,你原来里面怎么显示图象就怎么显示    dc.BitBlt(rectUpdate.left, rectUpdate.top,
    rectUpdate.Width(), rectUpdate.Height(),
    m_pdcMemory, rectUpdate.left, rectUpdate.top,
    SRCCOPY);////将内存DC复制到dc中

        m_pdcMemory->SelectObject(pOldBitmap);
        m_pdcMemory->SelectObject(pOldBrush);
    }程序中需要刷新时(例如在OnMouseMove()中)的刷新语句用  
    InvalidateRect(m_clientRect,FALSE);//参数含义自己查MSDN
    不要直接用Invalidate()等其他函数。这个在《VC6.0内幕》第四版第10章有介绍。
      

  5.   

    你是在OnMouseMove里面画
    还是在OnMouseMove里面invalidate然后在Ondraw里面画?
      

  6.   

    估计Lz是在OnPaint里做的,拿到OnEraseBkgnd里就应该没问题了。
      

  7.   

    这样的移动位图好像放在OnMouseMove中更好吧