在Win32中最小化加载和绘制BMP文件?

问题描述 投票:0回答:2

我正在寻找一种在 WIN32 图形界面上下文中加载和绘制位图的简约方法。没有 GDI+,请不要额外的库。

看起来 LoadBitmapA 是加载它的正确函数,这将为我提供 BITMAP / HBITMAP 类型的结构。但我没有看到加载后将该对象绘制到屏幕上的相应函数。它是什么?

我看到了设备独立位图BITMAPINFO,以及它方便的函数SetDIBitsToDevice,但是如何从BITMAP获取BITMAPINFO呢? 或者这就是正确的方法吗?

(请原谅,这可能是重复的,但我看到了针对如此多特殊情况的如此多的答案,以至于我不知道哪一个最适合我。)

winapi bitmap bitmapimage
2个回答
0
投票

这是一个相当简单的 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);
}

注意如果文件名不正确或者文件不存在将会失败。它还不允许图像大于窗口的情况。


0
投票

LoadBitmap()
已旧,请使用
LoadImage()
代替。

首先将

HBITMAP
放入源
SelectObject()
(例如来自
HDC
)中来绘制
CreateCompatibleDC()
,然后使用
BitBlt()
或其他类似函数从源
HDC 复制颜色数据
到目标
HDC
,例如从
Get(Window)DC()
BeginPaint()

© www.soinside.com 2019 - 2024. All rights reserved.