BOOL CBmpDlg::LoadBitmapFile(CString strFileName,CBitmap& bmp)
{
CFile file;
if( !file.Open(strFileName, CFile::modeRead) )
return FALSE; BITMAPFILEHEADER bmfHeader;
long nFileLen; nFileLen = file.GetLength(); if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))
return FALSE; if (bmfHeader.bfType != ((WORD)('M' <<8) | 'B'))
return FALSE; HGLOBAL hDIB = ::GlobalAlloc(GMEM_FIXED, nFileLen);////////////这句什么意思?完全不懂!!
if (hDIB == 0)
return FALSE; if (file.ReadHuge((LPSTR)hDIB, nFileLen - sizeof(BITMAPFILEHEADER)) !=
nFileLen - sizeof(BITMAPFILEHEADER) )
{
::GlobalFree(hDIB);
return FALSE;
} BITMAPINFO &bmInfo = *(LPBITMAPINFO) ::GlobalLock(hDIB) ;
BITMAPINFOHEADER *pInfoHead = (BITMAPINFOHEADER *)hDIB; int nHeaderSize=sizeof(BITMAPINFOHEADER);
BYTE *pBmpPixelBuffer=(BYTE *)&bmInfo+bmfHeader.bfOffBits - sizeof(BITMAPFILEHEADER); CDC dc;
dc.CreateDC("DISPLAY",NULL,NULL,NULL);
HBITMAP hBitmap;
hBitmap=CreateDIBitmap(dc.m_hDC,(BITMAPINFOHEADER *)&bmInfo,CBM_INIT,(VOID *)pBmpPixelBuffer,&bmInfo,DIB_RGB_COLORS);
bmp.Attach (hBitmap);
::GlobalUnlock (hDIB);
::GlobalFree(hDIB);
return TRUE;
}
{
CFile file;
if( !file.Open(strFileName, CFile::modeRead) )
return FALSE; BITMAPFILEHEADER bmfHeader;
long nFileLen; nFileLen = file.GetLength(); if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))
return FALSE; if (bmfHeader.bfType != ((WORD)('M' <<8) | 'B'))
return FALSE; HGLOBAL hDIB = ::GlobalAlloc(GMEM_FIXED, nFileLen);////////////这句什么意思?完全不懂!!
if (hDIB == 0)
return FALSE; if (file.ReadHuge((LPSTR)hDIB, nFileLen - sizeof(BITMAPFILEHEADER)) !=
nFileLen - sizeof(BITMAPFILEHEADER) )
{
::GlobalFree(hDIB);
return FALSE;
} BITMAPINFO &bmInfo = *(LPBITMAPINFO) ::GlobalLock(hDIB) ;
BITMAPINFOHEADER *pInfoHead = (BITMAPINFOHEADER *)hDIB; int nHeaderSize=sizeof(BITMAPINFOHEADER);
BYTE *pBmpPixelBuffer=(BYTE *)&bmInfo+bmfHeader.bfOffBits - sizeof(BITMAPFILEHEADER); CDC dc;
dc.CreateDC("DISPLAY",NULL,NULL,NULL);
HBITMAP hBitmap;
hBitmap=CreateDIBitmap(dc.m_hDC,(BITMAPINFOHEADER *)&bmInfo,CBM_INIT,(VOID *)pBmpPixelBuffer,&bmInfo,DIB_RGB_COLORS);
bmp.Attach (hBitmap);
::GlobalUnlock (hDIB);
::GlobalFree(hDIB);
return TRUE;
}
我知道global、bitmap
CBitmap(not CBbitmap)位图类,一个MFC类。
HBITMAP(不是HBitmap)位图资源句柄,CBitmap分装了位图句柄。
是什么意思?为什么要'M'<<8??
哪位大虾给讲解一下??
>>是什么意思?为什么要'M'<<8??
因为要判断位图的标志符号“BM",读取的是一个WORD,因此低地址存低字节'B',高8位地址存高字节'M'
这是用指定设备创建dib位图,bmInfo是位图头信息,具体信息参考MSDN,pBmpPixelBuffer是位图二维象素数组数据。
HBITMAP CreateDIBitmap(
HDC hdc, // handle to DC
CONST BITMAPINFOHEADER *lpbmih, // bitmap data
DWORD fdwInit, // initialization option
CONST VOID *lpbInit, // initialization data
CONST BITMAPINFO *lpbmi, // color-format data
UINT fuUsage // color-data usage
);