位图未在 Win32 C++ 中绘制

Posted

技术标签:

【中文标题】位图未在 Win32 C++ 中绘制【英文标题】:Bitmap not being painted in Win32 C++ 【发布时间】:2015-06-19 09:07:22 【问题描述】:

我有一个使用 Win32 的窗口,并且在消息处理程序中我有一个 WM_PAINT 案例,以便在窗口中绘制位图。但是在运行时未绘制位图,是否有我遗漏的东西?我需要手动发送 WM_PAINT 消息吗?

这是我的代码:http://pastebin.com/bi48LB0U

这是 WM_PAINT 案例:

case WM_PAINT:
    hDC = BeginPaint(hwnd, &ps);
    bmp = LoadBitmap(hInst, L"C:\\example.bmp");
    memDCExercising = CreateCompatibleDC(hDC);
    SelectObject(memDCExercising, bmp);
    BitBlt(hDC, 100, 100, 500, 500, memDCExercising, 0, 0, SRCCOPY);
    DeleteDC(memDCExercising);
    DeleteObject(bmp);
    EndPaint(hwnd, &ps);
    break;

【问题讨论】:

assert(bmp != NULL); 注定失败,LoadBitmap() 取的是资源ID,而不是路径名。你需要 LoadImage() 代替。是的,请始终检查 winapi 返回值,至少要检查 assert()。 如何从我的文件名中创建资源 ID? LoadBitmap: "指向以空字符结尾的字符串的指针,该字符串包含要加载的位图资源的名称。或者,此参数可以包括资源标识符在低位词中,在高位词中为零。" 您真的不想从WM_PAINT 的磁盘加载图像。这可以说很多。加载一次并保留 HBITMAP。 【参考方案1】:

您的位图未显示,因为您对 LoadBitmap 的调用返回 NULL,这是由于 lpBitmapName 参数无效。来自LoadBitmap 的文档:

lpBitmapName [in]:指向以空字符结尾的字符串的指针,该字符串包含要加载的位图资源的名称。或者,该参数可以由低位字中的资源标识符和高位字中的零组成。 MAKEINTRESOURCE 宏可用于创建此值。

换句话说:LoadBitmap 只能从Resources 加载类型为RT_BITMAP 的位图(或系统提供的预定义位图)。如果您需要从磁盘加载位图,请改用LoadImage。

如果您需要加载普通位图文件以外的图像数据,请考虑使用Windows Imaging Component。

【讨论】:

以上是关于位图未在 Win32 C++ 中绘制的主要内容,如果未能解决你的问题,请参考以下文章

用C++在Win32中用LoadImage()绘制HBITMAP的二维数组

在 WM_CREATE 中加载多个位图的 C++ Win32 不会加载

Win32 - 如何获取给定系统光标位图的偏移量?

win32api:在文本行中合并位图

在 Win32 中显示带 alpha 通道的 32 位图像

C++ MFC:将位图绘制到 CFrame 中