Win32应用使用LoadImageW加载位图无报错但不显示问题排查
Win32位图加载不显示问题解决方案
核心问题
你当前代码已经成功加载了位图(LoadImage返回非空,没有报错),但窗口没有显示图片的根本原因是你没有在窗口的绘制逻辑中将加载好的位图渲染到窗口上,另外还存在几个可能的潜在问题,具体如下:
具体问题及修复方案
缺失位图绘制逻辑
你当前的WM_PAINT消息处理仅填充了窗口背景,没有任何绘制位图的代码。首先需要让加载得到的位图句柄可以被窗口过程WindowProc访问,你可以将hImg定义为全局变量,或者通过SetPropAPI绑定到窗口句柄上。随后在WM_PAINT的BeginPaint和EndPaint之间添加如下绘制代码:
// 创建与窗口DC兼容的内存DC HDC hdcMem = CreateCompatibleDC(hdc); // 将位图选入内存DC HBITMAP hOldBmp = SelectObject(hdcMem, (HBITMAP)hImg); // 获取位图的宽高信息 BITMAP bmpInfo; GetObject(hImg, sizeof(BITMAP), &bmpInfo); // 将内存DC中的位图拷贝到窗口DC上,从窗口左上角(0,0)开始绘制 BitBlt(hdc, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, hdcMem, 0, 0, SRCCOPY); // 恢复DC状态并释放资源 SelectObject(hdcMem, hOldBmp); DeleteDC(hdcMem);
绘制完成后记得在WM_DESTROY消息中释放位图资源,避免内存泄漏:
case WM_DESTROY: DeleteObject(hImg); // 释放加载的位图 PostQuitMessage(0); return 0;
相对路径加载异常
你使用相对路径L"img.bmp"加载文件,程序运行时的工作目录不一定是exe文件所在目录(比如用IDE调试时工作目录通常为项目根目录),可能导致加载的不是你预期的位图。可以先用绝对路径测试,确认位图本身没有损坏:
HANDLE hImg = LoadImageW( NULL, L"C:\\完整路径替换成你的\\img.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
错误提示不可见
你使用std::cout输出错误,但wWinMain是GUI程序入口,默认不会分配控制台,所以即使加载失败你也看不到输出内容。建议改用MessageBoxW弹出错误提示,更适合GUI程序:
if (hImg == NULL) { WCHAR errBuf[256]; wsprintf(errBuf, L"加载失败,错误码:%d", GetLastError()); MessageBoxW(NULL, errBuf, L"错误", MB_ICONERROR); }
内容的提问来源于stack exchange,提问作者Wais Kamal
相关产品推荐
相关产品推荐

