上次也是这个问题,就是如何将当前CDC上的数据保存到内存DC上,在重画的时候直接从内存上显示出来,也就是重画问题
请给出一个比较详细的DEMO或者代码,我不知道什么时候保存到内存,何时又显示出来在下不剩感谢!
Email:[email protected]

解决方案 »

  1.   

    我网站上有CMemDC的例子,就是你要的
    这个例子在Dialog上画了边框并重画背景色http://www.crob.net/upload/DlgHasBorder.zipenjoy it
      

  2.   

    我看了,好象不怎么符合我的实际情况
    你的代码看起来还是在OnPaint()函数里调用了dc->DrawBord()
    我要求不在这个里面调用它,否则如果这个函数工作量很多
    内存DC还是没有什么明显的作用
    不知道我理解的对不对
      

  3.   

    重载OnDraw()函数
             CDC dc;
    CDC* pDrawDC = pDC;
    CBitmap bitmap;
    CBitmap* pOldBitmap; // only paint the rect that needs repainting
    CRect client;
    pDC->GetClipBox(client);
    CRect rect = client; DocToClient(rect); if (!pDC->IsPrinting())
    {
    // draw to offscreen bitmap for fast looking repaints
    if (dc.CreateCompatibleDC(pDC))
    {
    if (bitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()))
    {
    OnPrepareDC(&dc, NULL);
    pDrawDC = &dc; // offset origin more because bitmap is just piece of the whole drawing
    dc.OffsetViewportOrg(-rect.left, -rect.top);
    pOldBitmap = dc.SelectObject(&bitmap);
    dc.SetBrushOrg(rect.left % 8, rect.top % 8); // might as well clip to the same rectangle
    dc.IntersectClipRect(client);
    }
    }
    } // paint background
    CBrush brush;
    if (!brush.CreateSolidBrush(pDoc->GetPaperColor()))
    return; brush.UnrealizeObject();
    pDrawDC->FillRect(client, &brush); if (!pDC->IsPrinting() && m_bGrid)
    DrawGrid(pDrawDC); pDoc->Draw(pDrawDC, this); if (pDrawDC != pDC)
    {
    pDC->SetViewportOrg(0, 0);
    pDC->SetWindowOrg(0,0);
    pDC->SetMapMode(MM_TEXT);
    dc.SetViewportOrg(0, 0);
    dc.SetWindowOrg(0,0);
    dc.SetMapMode(MM_TEXT);
    pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),
    &dc, 0, 0, SRCCOPY);
    dc.SelectObject(pOldBitmap);
    }
    闪屏问题的解决办法是采用双缓冲技术。即创建与设备DC兼容的位图,在位图中绘制,然后Copy到屏幕上。注意,要重载BOOL CDrawView::OnEraseBkgnd(CDC*)函数,返回TRUE;

    BOOL CDrawView::OnEraseBkgnd(CDC*)
    {
    return TRUE;
    }
      

  4.   

    用这个在OnPaint里画是最简洁而且结果最好的,我画很多大型图表都是这样的,资源等各方面都不会有问题
      

  5.   

    我仔细看了Crob的程序
    你的程序的作用是当需要重新画界面的时候,所有的图表只是在内存中画而已,还是执行了所有的画图命令。我想的是:当需要重画的时候,只是将内存中的图表重新显示出来,这个图表是在需要重画之前保存到内存中去的。骑士的程序,其中有些函数是你自己的吧,不会也是重画到内存中去的吧。据我了解,CBitmap申明必须是全局的,这样才能保存并显示出来
      

  6.   

    不知道上次是不是回答的你的问题, 你创建 一个类成员的CBitmap指针,在你的ondraw()中 检测 pBitmap是不是空 ,如果不空就创建, 不是空直接帖上就可以了,当然,你需要在窗口大小改变等的情况下重建位图