Приложение Win32. HBITMAP LoadImage не может ничего загрузить

Я пишу функцию, которая быстро рисует изображение меню для игры, которую я делаю. Я умею хорошо рисовать фон и текстовые блоки, но у меня возникают проблемы при создании растрового изображения на экране.

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

3

Решение

Ваши ранние версии вопроса проверяли возвращаемое значение 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 и затем снова сохранил. Как только я это сделал, восстановленное изображение было успешно загружено.


Вместо того, чтобы пытаться загрузить это из файла, было бы гораздо разумнее связать изображение как ресурс и загрузить его таким образом.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]