1、有時需要使用一個與源CBitmap相同的CBitmap對象而不是一個源CBitmap對象的指針,例如不希望更改源CBitmap對象的情況下,就需要構造一個與源對象相同,但是與源對象無關的對象;通常情況下,會想到拷貝構造函數,但是CBitmap類比較特殊,不能使用該方法,那麼就只有自己來實現響應的構造操作了。總結了以下,大致有以下兩種方法:一是利用MFC封裝的繪圖設備,利用兩個CDC,將圖像拷貝過來;二是利用CreateBitmap直接構造。
2、實現一:
BOOL CopyCBitmapFromSrc(CBitmap* pBitmapDest, CBitmap* pBitmapSrc)
{
BOOL bFlag = FALSE;
CDC dcMemSrc;
CDC dcMemDest;
BITMAP bmpSrc;
dcMemSrc.CreateCompatibleDC(NULL);
dcMemSrc.SelectObject(pBitmapSrc);
pBitmapSrc->GetBitmap(&bmpSrc);
dcMemDest.CreateCompatibleDC(NULL);
pBitmapDest->CreateCompatibleBitmap(&dcMemSrc, bmpSrc.bmWidth, bmpSrc.bmHeight);
dcMemDest.SelectObject(pBitmapDest);
bFlag = dcMemDest.BitBlt(0, 0, bmpSrc.bmWidthBytes, bmpSrc.bmHeight, &dcMemSrc, 0, 0, SRCCOPY);
dcMemSrc.DeleteDC();
dcMemDest.DeleteDC();
return bFlag;
}
3、實現二:
BOOL CopyCBitmapFromSrc(CBitmap* pBitmapDest, CBitmap* pBitmapSrc)
{
BOOL bFlag = FALSE;
BITMAP bmpInfo;
// 獲取源圖信息
pBitmapSrc->GetBitmap(&bmpInfo);
// 求取每一個像素所佔的字節
long sizeBits = bmpInfo.bmWidth * bmpInfo.bmHeight * ( bmpInfo.bmWidthBytes / bmpInfo.bmWidth );
// 分配內存
PBYTE pBits = new BYTE[ sizeBits ];
ZeroMemory(pBits, sizeBits);
// 保存源圖像素信息
pBitmapSrc->GetBitmapBits(sizeBits, pBits);
// 創建新圖
bFlag = pBitmapDest->CreateBitmap(bmpInfo.bmWidth, bmpInfo.bmHeight, bmpInfo.bmPlanes, bmpInfo.bmBitsPixel, pBits);
// 回收資源
delete []pBits;
return bFlag;
}
調用示例:
CBitmap bmDest;
CopyCBitmapFromSrc(&bmDest, pBitmap);
4、實現三(來源於網絡):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | HBITMAP CMyDialog::CopyBitmap(HBITMAP hSourceHbitmap) { CDC sourceDC; CDC destDC; sourceDC.CreateCompatibleDC(NULL); destDC.CreateCompatibleDC(NULL); //The bitmap information. BITMAP bm = {0}; //Get the bitmap information. ::GetObject(hSourceHbitmap, sizeof(bm), &bm); // Create a bitmap to hold the result HBITMAP hbmResult = ::CreateCompatibleBitmap(CClientDC(NULL), bm.bmWidth, bm.bmHeight); HBITMAP hbmOldSource = (HBITMAP)::SelectObject(sourceDC.m_hDC, hSourceHbitmap); HBITMAP hbmOldDest = (HBITMAP)::SelectObject(destDC.m_hDC, hbmResult); destDC.BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &sourceDC, 0, 0, SRCCOPY ); // Restore DCs ::SelectObject(sourceDC.m_hDC, hbmOldSource); ::SelectObject(destDC.m_hDC, hbmOldDest); ::DeleteObject(sourceDC.m_hDC); ::DeleteObject(destDC.m_hDC); return hbmResult; } |
接下來函數調用:
1
2
3
4
|
//這樣簡單的操作就可以實現CBitmap的複製
CBitmapCpyBitmap;
//返回值可以檢測是否圖片拷貝成功
CpyBitmap->Attach(CopyBitmap(SrcBitmap));
|