【发布时间】:2020-01-28 19:55:27
【问题描述】:
我正在尝试在窗口上绘制位图文件。所以我使用了 (HBITMAP)LoadImage() 它返回 NULL。 我使用 GetLastError 来查看问题,但它也返回 0。 我正在开发 goorm ide(Windows 应用程序)。
HBITMAP hBitmap = NULL;
hBitmap = (HBITMAP)LoadImageW( NULL, L"C:\\Users\\Asd\\Downloads\\image.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
if(hBitmap == NULL){
DWORD errorCode = GetLastError();
if(errorCode != 0){
LPSTR messageBuffer = nullptr;
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
errorCode,
0,
(LPTSTR)&messageBuffer,
0,
NULL);
MessageBox(NULL, messageBuffer, "hBitmap is NULL!" , MB_OK);
}else{
MessageBox(NULL, "hBitmap is null but errorCode is 0", "???" , MB_OK);
}
}
如果我在代码中将“image.bmp”更改为“asdf.bmp”,它会显示“没有文件”。所以我确定它找到了文件,但似乎无法正常工作。当我打印位图的宽度和高度时,它显示奇怪的数字(如 12312321、-3453453)。我找不到问题所在。
我也试过这个: (来自https://support.microsoft.com/en-us/help/158898/howto-how-to-use-loadimage-to-read-a-bmp-file)
hBitmap = (HBITMAP)LoadImage( NULL, "image.bmp", IMAGE_BITMAP, 0, 0,
LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE );
【问题讨论】:
-
来自 LoadImageA 函数的文档:“如果 fuLoad 参数包含 LR_LOADFROMFILE 值,lpszName 是包含独立资源(图标、光标或位图文件)的文件的名称。因此,将hinst设置为NULL。”。所以基本上你应该将第一个参数设置为 NULL 而不是尝试获取你的模块。
-
我试过 hBitmap = (HBITMAP)LoadImage( NULL, "image.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE );但仍然是相同的错误消息。
-
@o_weisman
HBITMAP已经是指针类型,使用HBITMAP*是错误的。并且类型转换不能产生 NULL,除非被转换的值已经是 NULL。 -
@이재원 您是否尝试过使用
.bmp文件的绝对路径?您当前正在使用相对路径。另见LoadImage() returns NULL and GetLastError() returns 0。我注意到的一件事是您的WM_PAINT代码没有进行任何错误处理,它在第一次绘制后破坏了hBitmap,使hBitmap对后续绘制无效。由于您在WM_CREATE中加载了hBitmap,因此您应该在WM_DESTROY中销毁它。 -
@이재원 然后缺少其他一些内存错误,逻辑罪魁祸首可能是
.bmp文件本身的问题。您是否尝试过使用其他.bmp文件?