Я пишу функцию, которая быстро рисует изображение меню для игры, которую я делаю. Я умею хорошо рисовать фон и текстовые блоки, но у меня возникают проблемы при создании растрового изображения на экране.
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? У меня есть другие методы, которые я планирую запустить подобными способами, поэтому запуск этой функции действительно поможет.
РЕДАКТИРОВАТЬ * Всякий раз, когда я даю полный путь, он все равно не загружается.
Также это не подходящий код для SO? Это мой первый вопрос …
РЕДАКТИРОВАТЬ ** Дополнительные / не решили проблему.
РЕДАКТИРОВАТЬ *** Используя GetLastError, я обнаружил, что код ошибки равен 2, ERROR_FILE_NOT_FOUND
Ваши ранние версии вопроса проверяли возвращаемое значение LoadImage
но потом больше ничего не делал. документация говорит это:
Если функция не работает, возвращаемое значение
NULL
, Чтобы получить расширенную информацию об ошибке, позвонитеGetLastError
,
Итак, если функция не работает, вызовите GetLastError
чтобы выяснить почему. Когда вы делаете это, вы получаете код ошибки ERROR_FILE_NOT_FOUND
, Что довольно убедительно. Указанное вами имя файла не существует.
Обратите внимание, что код в последнем обновлении вопроса вызывает GetLastError
безусловно. Это ошибка, которая часто встречается здесь, на переполнении стека. Документация только говорит вам позвонить GetLastError
когда звонок LoadImage
выходит из строя. Если звонок LoadImage
успешно, то возвращаемое значение GetLastError
бессмысленно. Обработка ошибок в Win32 в основном обрабатывается так же, как LoadImage
делает это, но не всегда. Поэтому вы должны внимательно прочитать документацию.
Возможно вместо
C:\\Users\\Tim\documents\\...
Вы имели в виду
C:\\Users\\Tim\\documents\\...
Хорошо, теперь у вас есть правильный путь. Призыв к LoadImage
возвращается NULL
, но GetLastError
больше не помогает и возвращает ERROR_SUCCESS
, Что странно само по себе.
Я считаю, что проблема в том, что ваше изображение использует формат, который LoadImage
не понимает. Я взял ваш файл .bmp, загрузил его в Paint.net и затем снова сохранил. Как только я это сделал, восстановленное изображение было успешно загружено.
Вместо того, чтобы пытаться загрузить это из файла, было бы гораздо разумнее связать изображение как ресурс и загрузить его таким образом.
Других решений пока нет …