CBitmap bmp; bmp.CreateBitmap(100,100,1,1,m_buf); // m_buf是已有的内存图象区域
  CDC dc;      dc.CreateCompatiableDC(pDC);
  CBitmap *pOldBmp = dc.SelectObject(&bmp);
  ...... // 绘图
  dc.SelectObject(pOldBmp);  // 发现m_buf并没改变,除非加上下一句
  bmp.Getbitblts(100*100,m_buf);
}
以上程序说明CreateBitmap实际建立了副本,假如m_buf非常大,建立副本会浪费时间空间,如何解决?

解决方案 »

  1.   

    用CBitmap::SetBitmapBits应该可以的
      

  2.   

    本来就没变,你再把它考过去不就变了。
    HDC  hDC = NULL, hSourceDC; 
        HBITMAP      hSourceBitmap; 
        DWORD        dwSourceBitsSize; 

    LPBITMAPINFO lpSrcDIB = (LPBITMAPINFO)lpDIB;

        // Gonna use DIBSections and BitBlt() to do the conversion, so make 'em 
    hDC = ::GetDC(NULL); 
        hSourceBitmap = CreateDIBSection( hDC, lpSrcDIB, 0, &m_lpSourceBits, NULL, 0 ); 
        hSourceDC = CreateCompatibleDC( hDC ); 
        dwSourceBitsSize = lpSrcDIB->bmiHeader.biHeight *WIDTHBYTES(((LPBITMAPINFOHEADER)lpDIB)->biWidth * ((LPBITMAPINFOHEADER)lpDIB)->biPlanes * ((LPBITMAPINFOHEADER)lpDIB)->biBitCount); 
        memcpy( m_lpSourceBits, ::FindDIBBits(lpDIB), dwSourceBitsSize );
    m_pMemDC = new CDC;
    m_pMemDC->CreateCompatibleDC(NULL);
    m_hOldSourceBitmap=(HBITMAP) m_pMemDC->SelectObject(hSourceBitmap);
    DeleteDC( hSourceDC ); 
    ::ReleaseDC( NULL,hDC );
    //CBrush *OldBrush;
    //OldBrush=(CBrush*)m_pMemDC->SelectStockObject(NULL_BRUSH);//创建一个不填充的画刷
    // m_pMemDC->SetBkColor(TRANSPARENT);//OPAQUE
    int OldBKMode=m_pMemDC->SetBkMode(TRANSPARENT);
    // m_pMemDC->SetBkColor(GetSysColor(COLOR_BTNFACE));
    CPen pen,*OldPen;
    pen.CreatePen(0,PenWidth,PenColor);//(PenStyle,PenWidth,RGB(PenColor,PenColor,PenColor));
    OldPen=(CPen *)m_pMemDC->SelectObject(pen);
    COLORREF OldColor=m_pMemDC->SetTextColor(PenColor);

    m_pMemDC->MoveTo(RulerBeginX,RulerBeginY);
    m_pMemDC->LineTo(RulerEndX,RulerEndY );

    dwSourceBitsSize = lpSrcDIB->bmiHeader.biHeight *WIDTHBYTES(((LPBITMAPINFOHEADER)lpDIB)->biWidth * ((LPBITMAPINFOHEADER)lpDIB)->biPlanes * ((LPBITMAPINFOHEADER)lpDIB)->biBitCount); 
        memcpy( ::FindDIBBits(lpDIB),m_lpSourceBits,dwSourceBitsSize);
    m_pMemDC->SelectObject(m_hOldSourceBitmap);
    m_pMemDC->SelectObject(&OldPen);
    m_pMemDC->SetBkMode(OldBKMode);
    m_pMemDC->SetTextColor(OldColor);
    pen.DeleteObject();
    //m_pMemDC->SelectObject(OldBrush);
    GlobalUnlock((HGLOBAL) hDIB);//解锁DIB,丢掉这段内存
    delete m_pMemDC;
    m_pMemDC=NULL;
    pDoc->UpdateAllViews(NULL);
    你照着改改
      

  3.   

    试试directdraw,得到一个surface对象,先lock就可以直接操作显示的内存,用CreateBitmapIndirect直接将里面的显存地址作参数创建位图用完后unlock