我的程序在绘图过程有点慢,看起来像是动画.我想把图画好后,保存为位图 ,然后在OnDraw()中加载,并显示出来,这样就看不一绘图过程了,但是自己做了很久都没做出来,每次都是窗口发生重绘图形就消失了.急求这方面的代码,,,,非常非常感谢.这是经毕业设计中的一部分呀,老过不了这人坎,着急!

解决方案 »

  1.   

    那就设置一个CBitmap变量,并创建为内存位图:CreateCompatibleBitmap(),然后创建内存DC,将这个位图选入内存DC,在内存DC上绘图,完成后再选出内存DC。下次就可以把这个位图绘制到屏幕上。也就是双缓冲的方法。
      

  2.   

    我就是按这样的方法做的呀,可是位图就是没有显示出来:下面是我的代码,帮忙看看哪错了啊:
    CBitmap* CPic_RDAView::CopyClientToBitmap()
    {
    // HDC hCltDC, hMemDC;
    CDC* pCltDC;
    CDC* pMemDC; 
    CDC mMemDC;

    CBitmap Bitmap, OldBitmap;
    CBitmap* pBitmap; 
    CBitmap* pOldBitmap;
    int nX, nY, nX2, nY2;     

    CRect rc;

    GetClientRect(rc);
    nX = rc.left ;
    nY = rc.top;
    nX2 = rc.right;
    nY2 = rc.bottom;
        nWidth   =   nX2   -   nX;   //得到位图宽度
        nHeigth   =   nY2   -   nY;  //我到位图高度
    CClientDC dcCliet(this);
    pCltDC = &dcCliet;
        mMemDC.CreateCompatibleDC(pCltDC);
    pMemDC = &mMemDC;
    Bitmap.CreateCompatibleBitmap(&mMemDC ,nWidth,  nHeigth  );
    pBitmap = &Bitmap;
    pOldBitmap = mMemDC.SelectObject(pBitmap);
    mMemDC.BitBlt(0,0,nWidth,nHeigth,pCltDC,nX,nY,SRCCOPY);
    pBitmap = mMemDC.SelectObject(pOldBitmap); 

    return pBitmap;
    }
    CPic_RDAView::function1()
     {
       DrawPic();    //实现在客户区绘图
       pBitmap = CopyClientToBitmap();//画完后将整个客户区作为位图保存,取得位图指针
       CopyOver = TRUE;//标志提取位图指针结束;
     }
     
    然后在OnDraw()中加入:
          {  if(CopyOver)
    {
    CDC dcMem;
    CBitmap* pOldBitmap;
    dcMem.CreateCompatibleDC(pDC);
    pOldBitmap = dcMem.SelectObject(pBitmap);
    pDC->BitBlt(0,0,nWidth,nHeigth,&dcMem,0,0,SRCCOPY);
    dcMem.SelectObject(pOldBitmap);
    dcMem.DeleteDC();
    }
         }
    备注:编译都可以通过,运行时可以看到绘图过程(因为这个图形绘制耗时),绘完后图形显示正常,但旦窗口改变大小后,图形就不见了,,,我以前把DrawPic()放到Ondraw中,就是因为每次窗口发生大小变化图形都得重画,所以想到画好后将它作为一张位图在OnDraw()中显示,问题就是保存为位图后调用就不对了.