繁体   English   中英

Win32 应用程序。 HBITMAP LoadImage 无法加载任何内容

[英]Win32 application. HBITMAP LoadImage fails to load anything

我正在编写一个 function 快速绘制我正在制作的游戏的菜单图像。 我可以很好地绘制背景和文本块,但在屏幕上创建 bitmap 图像时遇到问题

bool menu::drawMenu(PAINTSTRUCT ps)
{
HWND hWnd = GetActiveWindow();
HDC hdc = GetDC(hWnd), hdcMem;

//Draw a new background

HPEN blackPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
HBRUSH blackBrush = CreateSolidBrush(RGB(0, 0, 0));
SelectObject(hdc, blackPen);
SelectObject(hdc, blackBrush);
Rectangle(hdc, 0, 0, 1080, 720);

//insert selection text

TextOut(hdc, 30, 0, L"New Game", 8);
TextOut(hdc, 30, 30, L"Exit Game", 9);

//draw arrow sprite

HBITMAP arrow = (HBITMAP)LoadImage(NULL, L"C:\\Users\\Tim\documents\\visual studio 2013\\Projects\\BoulderBisque\\BoulderBisque\\arrow.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    DWORD lastError = GetLastError();
if (arrow == NULL)
{
    TextOut(hdc, 0, 60, L"Image Load Failed", 17);
    return false;
}
hdcMem = CreateCompatibleDC(hdc);
if (hdcMem == NULL)
{
    TextOut(hdc, 0, 90, L"Memory Creation Failed", 22);
    return false;
}
SelectObject(hdcMem, arrow);
BitBlt(hdc, 0, choice * 30, 16, 16, hdcMem, 0, 0, SRCCOPY);

//cleanup

ReleaseDC(hWnd, hdc);
DeleteDC(hdcMem);

return true;
}

截至目前,箭头是 NULL,我得到加载图像失败文本框。 我正在使用 arrow.bmp 的相对路径我也尝试使用完整路径,但也没有用。

你可能已经注意到这个 function 在 WndProc 之外。 其他一切都很好。 除了 arrow.bmp 加载之外,我也尝试在那里运行它。

我做错了什么导致 arrow.bmp 成为 NULL? 我计划以类似的方式运行其他方法,因此让这个 function 运行真的会有很大帮助。

编辑* 每当我给出完整路径名时,它仍然无法加载。 这也不是适合 SO 的代码吗? 这是我的第一个问题...

编辑** 附加的 '/' 没有解决问题。

编辑*** 使用 GetLastError,我发现错误代码为 2,ERROR_FILE_NOT_FOUND

您的早期版本的问题检查了LoadImage的返回值,但后来没有做任何其他事情。 文档说明了这一点:

如果函数失败,则返回值为NULL 要获取扩展错误信息,请调用GetLastError

因此,如果函数失败,请调用GetLastError以找出原因。 执行此操作时,您将获得错误代码ERROR_FILE_NOT_FOUND 这是非常确凿的。 您指定的文件名不存在。

请注意,问题的最新更新中的代码无条件地调用GetLastError 这是一个错误,在Stack Overflow上经常出现这个错误。 该文档仅告诉您在对LoadImage的调用失败时调用GetLastError 如果对LoadImage的调用成功,那么GetLastError返回的值就没有意义了。 Win32中的错误处理主要以与LoadImage相同的方式处理,但并非总是如此。 因此,您必须非常仔细地阅读文档。


也许不是

C:\\Users\\Tim\documents\\...

你的意思是

C:\\Users\\Tim\\documents\\...

好的,现在你的路径正确了。 LoadImage的调用返回NULL ,但GetLastError不再有用,并返回ERROR_SUCCESS 这本身就很奇怪。

我相信问题是你的图像使用的是LoadImage不理解的格式。 我把你的.bmp文件加载到Paint.net中,然后重新保存。 完成后,重新保存的图像已成功加载。


不是试图从文件中加载它,而是将图像作为资源链接并以这种方式加载它会更有意义。

我通过试验 Gimp 发现,your.bmp 文件必须具有以下属性才能工作:

  1. depth:24bit
  2. 选中“不显示写入色彩空间信息”框: Gimp 导出选项

如果仍然不起作用,请尝试“解锁”它:文件选项

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM