打开并显示.BMP文件

【勇芳软件工作室】汉化HomePreviousNext

在示例应用程序中,用户能够打开包含位图图像的.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;