You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用GDI在桌面绘制位图无显示,错误码2求助

GDI桌面绘图无显示(错误码2)问题排查与修复

错误码2对应ERROR_FILE_NOT_FOUND,说明LoadImageA找不到指定的位图文件,这是导致无显示的核心原因,同时你的代码还存在GDI资源管理问题,以下是分步修复方案:

1. 解决文件路径问题

  • 确保Globals::bmpPath是绝对路径,比如"C:\\test.bmp",相对路径会因程序运行目录不同导致文件查找失败。
  • 检查路径转义符:C++字符串中路径分隔符需用双反斜杠\\,或使用原始字符串R"(C:\test.bmp)"避免转义错误。
  • 验证文件实际存在:确认文件名(包括.bmp后缀)正确,注意系统可能隐藏已知文件后缀,避免出现test.bmp实际存为test.bmp.bmp的情况。

2. 修复GDI资源泄漏与错误使用

你的代码未正确释放GDI资源,不仅会造成内存泄漏,还可能干扰绘图逻辑,修正后的代码如下:

#include <windows.h>
#include <thread>
#include <iostream>

namespace Globals {
    std::string bmpPath = "C:\\your_target_image.bmp"; // 替换为正确绝对路径
}

int main() {
    while (true) {
        BITMAP bitMap = {0};
        // 加载位图,添加错误检查与LR_CREATEDIBSECTION避免设备依赖问题
        HBITMAP hBitmap = reinterpret_cast<HBITMAP>(LoadImageA(
            NULL,
            Globals::bmpPath.c_str(),
            IMAGE_BITMAP,
            0, 0, // 设为0使用原图尺寸,避免强制拉伸异常
            LR_LOADFROMFILE | LR_CREATEDIBSECTION
        ));

        if (!hBitmap) {
            DWORD err = GetLastError();
            std::cout << "LoadImage失败,错误码: " << err << std::endl;
            std::this_thread::sleep_for(std::chrono::milliseconds(200));
            continue;
        }

        HDC whdc = GetDC(NULL);
        if (!whdc) {
            DeleteObject(hBitmap);
            std::this_thread::sleep_for(std::chrono::milliseconds(200));
            continue;
        }

        HDC hdcMem = CreateCompatibleDC(whdc);
        if (!hdcMem) {
            ReleaseDC(NULL, whdc);
            DeleteObject(hBitmap);
            std::this_thread::sleep_for(std::chrono::milliseconds(200));
            continue;
        }

        // 保存DC原有位图,后续必须恢复
        HBITMAP hOldBitmap = reinterpret_cast<HBITMAP>(SelectObject(hdcMem, hBitmap));
        GetObject(reinterpret_cast<HGDIOBJ>(hBitmap), sizeof(bitMap), &bitMap);

        // 使用位图实际宽高绘制,避免硬编码不匹配
        BitBlt(whdc, 0, 0, bitMap.bmWidth, bitMap.bmHeight, hdcMem, 0, 0, SRCCOPY);

        // 按顺序释放所有GDI资源
        SelectObject(hdcMem, hOldBitmap);
        DeleteDC(hdcMem);
        ReleaseDC(NULL, whdc);
        DeleteObject(hBitmap);

        std::this_thread::sleep_for(std::chrono::milliseconds(200));
    }
    return 0;
}

3. 额外注意事项

  • 桌面窗口会定期重绘,直接绘制到桌面DC的内容很快会被覆盖。如果需要持久显示,建议创建一个顶层无框窗口,在窗口的WM_PAINT消息中完成位图绘制。
  • 若必须使用指定尺寸(1536x864),需确保位图本身尺寸与该参数匹配,或接受LoadImage的强制拉伸效果。

内容的提问来源于stack exchange,提问作者Natan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 22:36:20