使用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
相关产品推荐
相关产品推荐

