1.HBITMAP轉成CBitmap:
HBITMAP hBmp;
//hBmp的初始化代碼
CBitmap* pBmp = CBitmap::FromHandle(hBmp);
HBITMAP hbmp;
CBitmap bmp;
bmp.Attach(hbmp);
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
HBITMAP hbm = (HBITMAP)bmp;
CBitmap bmp1;
bmp1.Attach(hbm);
2.CBitmap轉成HBITMAP:
CBitmap* pBmp;
HBITMAP hBmp = (HBITMAP)(*pBmp);//(HBITMAP)是CBitmap類重載了的操作符
CBitmap::FromHandle() 轉換出來的臨時 CBitmap 對象似乎並不是可靠的!MSDN 上說這個臨時只在某一時間段內有效。等到某個閒置時候,這個臨時 CBitmap 對象會被清除掉。
所以覺得還是 new Bitmap().Attach(HBITMAP) 好一點,至少我用的時候沒出問題。。。
用fopen開啟一個bmp檔案,請問怎樣取得它的HDIB控制代碼?
MSDN中對HDIB的運用是:BMP檔案除去檔案頭(BITMAPFILEHEADER)以後的所有內容。當然你也可以定義其批向BMP檔案的點陣資訊!
HDIB是要你自己獲得的,它不過是個記憶體控制代碼而已,用GlobalAlloc分配一塊用於儲存位元影像資料
的記憶體,傳回值就是一個HDIB,不過,記憶體裡面一定要有映像資料
BOOL ReadDIBFile(LPCTSTR strFileName)
{
BITMAPFILEHEADER bmfHeader;
DWORD dwBitsSize;
HDIB hDIB;
LPSTR pDIB;
CFile file;
if(!file.Open(strFileName,CFile::modeRead))
{
TRACE("failed to open img file\n");
return FALSE;
}
// 擷取DIB(檔案)長度(位元組)
dwBitsSize = file.GetLength();
// 嘗試讀取DIB檔案頭
if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))
{
TRACE("failed to read image file\n");
file.Close();
return FALSE;
}
// 判斷是否是DIB對象,檢查頭兩個位元組是否是"BM"
if (bmfHeader.bfType != DIB_HEADER_MARKER)
{
TRACE("not a valid bmp file\n");
file.Close();
return FALSE;
}
// 為DIB分配記憶體
hDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwBitsSize);
if (hDIB == 0)
{
TRACE("failed to alloc memory when read img file to buffer\n");
return FALSE;
}
// 鎖定
pDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
// 讀象素
if (file.ReadHuge(pDIB, dwBitsSize - sizeof(BITMAPFILEHEADER)) !=
dwBitsSize - sizeof(BITMAPFILEHEADER) )
{
TRACE("not a valid file length\n");
::GlobalUnlock((HGLOBAL) hDIB);
::GlobalFree((HGLOBAL) hDIB);
return FALSE;
}
file.Close();
return TRUE;
}