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非常大,建立副本会浪费时间空间,如何解决?
CDC dc; dc.CreateCompatiableDC(pDC);
CBitmap *pOldBmp = dc.SelectObject(&bmp);
...... // 绘图
dc.SelectObject(pOldBmp); // 发现m_buf并没改变,除非加上下一句
bmp.Getbitblts(100*100,m_buf);
}
以上程序说明CreateBitmap实际建立了副本,假如m_buf非常大,建立副本会浪费时间空间,如何解决?
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);
你照着改改