HBITMAP 與 CBitmap 、BITMAP、HDIB

來源:互聯網
上載者:User

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;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.