我正在寻找一种在 WIN32 图形界面上下文中加载和绘制位图的简约方法。没有 GDI+,请不要额外的库。
看起来 LoadBitmapA 是加载它的正确函数,这将为我提供 BITMAP / HBITMAP 类型的结构。但我没有看到加载后将该对象绘制到屏幕上的相应函数。它是什么?
我看到了设备独立位图BITMAPINFO,以及它方便的函数SetDIBitsToDevice,但是如何从BITMAP获取BITMAPINFO呢? 或者这就是正确的方法吗?
(请原谅,这可能是重复的,但我看到了针对如此多特殊情况的如此多的答案,以至于我不知道哪一个最适合我。)
这是一个相当简单的 WM_PAINT 处理程序代码示例,可以完成这项工作。
void OnPaint(
HWND hWnd
)
{
PAINTSTRUCT paintStruct;
HDC hDC = BeginPaint(hWnd, &paintStruct);
HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, pszFilename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
HDC hdcMem = CreateCompatibleDC(paintStruct.hdc);
HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, hBitmap);
BITMAP bitmap;
GetObject(hBitmap, sizeof(bitmap), &bitmap);
BitBlt(paintStruct.hdc, 10, 10, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY);
SelectObject(hdcMem, hbmOld);
// tell windows we're finished here...
EndPaint(hWnd, &paintStruct);
}
注意如果文件名不正确或者文件不存在将会失败。它还不允许图像大于窗口的情况。
LoadBitmap()
已旧,请使用 LoadImage()
代替。
首先将
HBITMAP
放入源 SelectObject()
(例如来自 HDC
)中来绘制 CreateCompatibleDC()
,然后使用 BitBlt()
或其他类似函数从源 HDC
复制颜色数据
到目标 HDC
,例如从Get(Window)DC()
或 BeginPaint()
。