是一个图形重绘方面的问题,我想在重绘之前把view中的内容用BitBlt拷到一个CDC MemDC中,然后在重绘时再用该函数拷出来,应该在什么时候拷入呢,具体方法是如何的?拷出又该怎样做呢?
最好请给出关键代码.
先谢谢了.

解决方案 »

  1.   

    什么意思?
    你不是知道用BitBlt吗?
      

  2.   

    建立一个公用的MemDC,在程序Invalidate之前Bitblt
    即保存当前view
    然后在OnDraw中:

      CDC * dc = FromHandle(::GetDC(NULL)) ;
      dc->BitBlt(..., MemDC, ...)
      ..........
    }
      

  3.   

    我在onPaint中加入了以下代码,但是一重绘就报错!
    CRect rect;
    GetClientRect(&rect);
    MemDC.Attach((HDC)this->GetDC());
    MemDC.BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY);
      

  4.   

    谢谢siphonelee,在invalidate之前应是什么事件呢,具体应该如何保存.
      

  5.   

    我以为onPaint调用ondraw,所以在onPaint中保存,是不是不对
      

  6.   

    重绘你编个函数就行!就得每次FREE,我就是吃过那个苦!
      

  7.   

    在OnDraw(CDC *pDC)中:
     CDC MemDC; //首先定义一个显示设备对象
     CBitmap MemBitmap;//定义一个位图对象 //随后建立与屏幕显示兼容的内存显示设备
     MemDC.CreateCompatibleDC(NULL);
     //这时还不能绘图,因为没有地方画 ^_^
     //下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小
     MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);
      
     //将位图选入到内存显示设备中
     //只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
     CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); //先用背景色将位图清除干净,这里我用的是白色作为背景
     //你也可以用自己应该用的颜色
     MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255)); //绘图
     MemDC.MoveTo(……);
     MemDC.LineTo(……);
     
     //将内存中的图拷贝到屏幕上进行显示
     pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY); //绘图完成后的清理
     MemBitmap.DeleteObject();
     MemDC.DeleteDC();
      

  8.   

    谢谢vccsdn,我的问题在于我是在onmousemove中画图的,那该怎么办.我的思路是在ondraw前保存,然后在ondraw时显示.
      

  9.   

    改OnPaint函数为
    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);
            dc.BitBlt(rectUpdate.left, rectUpdate.top,
                  rectUpdate.Width(), rectUpdate.Height(),
                  m_pdcMemory, rectUpdate.left, rectUpdate.top,
                  SRCCOPY);
           m_pdcMemory->SelectObject(pOldBitmap);
           m_pdcMemory->SelectObject(pOldBrush);
      

  10.   

    在OninitUpdate中添加
    if (m_pdcMemory->GetSafeHdc() == NULL)
    {
    CClientDC dc(this);  //dc映射方式也为MM_LOENGLISH
    OnPrepareDC(&dc); CRect rectMax(0,0,sizeTotal.cx,-sizeTotal.cy);
    dc.LPtoDP(rectMax);
    m_pBitmap->CreateCompatibleBitmap(&dc,rectMax.right,
    rectMax.bottom);
    m_pdcMemory->SetMapMode(MM_LOENGLISH);
    }
      

  11.   

    CRect rect;
    GetClientRect(&rect);
    MemDC.Attach( (HDC) (this->GetDC()) );
                 ~~~~~~~~~~~~~~~~~~~~~~
    MemDC.BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY);