在示例应用程序中,用户能够打开包含位图图像的.BMP文件,并在应用程序窗口的客户区中显示该图像。当应用程序显示打开对话框时,用户选择要打开的文件。(有关打开对话框的详细信息,请参阅通用对话框库.)
用户选择文件并关闭对话框后,文件和路径名称将存储在OPENFILENAME结构的成员中。应用程序使用此数据打开适当的文件并检索位图标题和数据。以下代码示例可用于检索此数据。
/ *检索标识文件的句柄。*/
hfbm = CreateFile(ofn.lpstrFile, GENERIC_READ,
FILE_SHARE_READ, (LPSECURITY_ATTRIBUTES) NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_READONLY,
(HANDLE) NULL);
/ *检索BITMAPFILEHEADER结构。*/
ReadFile(hfbm,& bmfh,sizeof(BITMAPFILEHEADER),
&dwRead, (LPOVERLAPPED)NULL);
/ *检索BITMAPFILEHEADER结构。*/
ReadFile(hfbm,& bmih,sizeof(BITMAPINFOHEADER),
&dwRead, (LPOVERLAPPED)NULL);
/ *为BITMAPINFO结构分配内存。*/
hmem1 = GlobalAlloc(GHND,
sizeof(BITMAPINFOHEADER)+
((1<<bmih.biBitCount) * sizeof(RGBQUAD)));
lpbmi = GlobalLock(hmem1);
/*
*将BITMAPINFOHEADER加载到BITMAPINFO中
* 结构体。
*/
lpbmi->bmiHeader.biSize = bmih.biSize;
lpbmi->bmiHeader.biWidth = bmih.biWidth;
lpbmi->bmiHeader.biHeight = bmih.biHeight;
lpbmi->bmiHeader.biPlanes = bmih.biPlanes;
lpbmi->bmiHeader.biBitCount = bmih.biBitCount;
lpbmi->bmiHeader.biCompression = bmih.biCompression;
lpbmi->bmiHeader.biSizeImage = bmih.biSizeImage;
lpbmi->bmiHeader.biXPelsPerMeter = bmih.biXPelsPerMeter;
lpbmi->bmiHeader.biYPelsPerMeter = bmih.biYPelsPerMeter;
lpbmi->bmiHeader.biClrUsed = bmih.biClrUsed;
lpbmi->bmiHeader.biClrImportant = bmih.biClrImportant;
/*
*检索颜色表。
* 1 << bmih.biBitCount == 2 ^ bmih.biBitCount
*/
ReadFile(hfbm,lpbmi- > bmiColors,
((1 < < bmih.biBitCount)* sizeof(RGBQUAD)),
&dwRead, (LPOVERLAPPED) NULL);
/*
*为所需数量分配内存
*字节。
*/
hmem2 = GlobalAlloc(GHND,
(bmfh.bfSize - bmfh.bfOffBits));
lpvBits = GlobalLock(hmem2);
/ *检索位图数据。*/
ReadFile(hfbm,lpvBits,
(Bmfh.bfSize - bmfh.bfOffBits)
&dwRead, (LPOVERLAPPED) NULL);
/*
*从存储的数据中创建一个位图
* .BMP文件。
*/
hbm = CreateDIBitmap(hdc, &bmih,
CBM_INIT,lpvBits,
lpbmi, DIB_RGB_COLORS);
/*
*解锁全局内存对象和
*关闭.BMP文件。
*/
GlobalUnlock(hmem1);
GlobalUnlock(hmem2);
CloseHandle(hfbm);
/ *设置fDisplayBitmap标志。*/
如果(hbm)
fDisplayBitmap = TRUE;
其他
TextOut(hdc, 100, 100, "LoadBitmap Failed", 17);
/ *绘制窗口(并绘制位图)。*/
GetClientRect(hwnd, &rect);
InvalidateRect(hwnd, &rect, TRUE);
UpdateWindow(hwnd);
一旦检索到位图数据,可以在应用程序的客户区中绘制位图图像。以下代码示例用于绘制位图。
case WM_PAINT:
BeginPaint(hwnd, &ps);
if(fDisplayBitmap){
hdcMem = CreateCompatibleDC(ps.hdc);
SelectObject(hdcMem, hbm);
GetObject(hbm, sizeof(BITMAP), (LPSTR) &bm);
BitBlt(ps.hdc,0,0,bm.bmWidth,bm.bmHeight,
hdcMem, 0, 0, SRCCOPY);
DeleteDC(hdcMem);
}
EndPaint(hwnd, &ps);
break;