【发布时间】:2014-01-02 06:10:37
【问题描述】:
我正在编写一个函数,可以快速为我正在制作的游戏绘制菜单图像。我可以很好地绘制背景和文本块,但我无法在屏幕上创建位图图像
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,并且我得到了 Load Image Failed 文本框。 我正在使用arrow.bmp的相对路径,我也尝试使用完整路径,但也没有用。
你可能已经注意到这个函数在 WndProc 之外。其他一切都画得很好。 除了arrow.bmp加载之外,我也尝试在那里运行它。
我做错了什么导致arrow.bmp为NULL?我还有其他方法我计划以类似的方式运行,所以让这个函数运行真的很有帮助。
EDIT* 每当我给出完整的路径名时,它仍然无法加载。 这也不是适合 SO 的代码吗?这是我的第一个问题...
EDIT** 附加的 '/' 没有解决问题。
EDIT*** 使用GetLastError,我发现错误代码是2,ERROR_FILE_NOT_FOUND
【问题讨论】:
-
始终使用文件的完整路径。始终在 SO 问题中发布正确的代码。
-
GetActiveWindow调用似乎也有点可疑。 -
应该是
L"C:\\Users\\Tim\\Documents\\visual studio 2013\\Projects\\BoulderBisque\\BoulderBisque\\arrow.bmp"更多的`\`东西。 -
编写一个小型控制台测试程序,它只会尝试加载图像。
-
您必须仔细阅读文档。当
LoadImage返回NULL时,您可以致电GetLastError了解更多信息。它在文档中写得尽可能清楚。您只需阅读文档。因此,请致电GetLastError了解更多信息。
标签: c++ winapi bitmap null loadimage