c++ winapi bitmap null loadimage

c++ - Aplicación Win32. HBITMAP LoadImage no carga nada



winapi null (1)

Sus primeras versiones de la pregunta verificaron el valor de retorno de LoadImage pero luego no hicieron nada más. La documentación dice esto:

Si la función falla, el valor de retorno es NULL . Para obtener información extendida sobre el error, llame a GetLastError .

Entonces, si la función falla, llame a GetLastError para averiguar por qué. Cuando lo hace, obtiene el código de error ERROR_FILE_NOT_FOUND . Lo cual es bastante concluyente. El nombre de archivo que especificó no existe.

Tenga en cuenta que el código en la última actualización de la pregunta llama GetLastError incondicionalmente. Eso es un error, uno que se ve con demasiada frecuencia aquí en Stack Overflow. La documentación solo le indica que llame a GetLastError cuando GetLastError la llamada a LoadImage . Si la llamada a LoadImage tiene éxito, entonces el valor devuelto por GetLastError tiene sentido. El manejo de errores en Win32 se maneja en gran parte de la misma manera que LoadImage hace LoadImage , pero no siempre. Entonces debes leer la documentación con mucho cuidado.

Quizás en lugar de

C://Users//Tim/documents//...

te referías

C://Users//Tim//documents//...

OK, ahora tienes el camino correcto. La llamada a LoadImage devuelve NULL , pero GetLastError ya no es útil y devuelve ERROR_SUCCESS . Lo cual es extraño en sí mismo.

Creo que el problema es que su imagen utiliza un formato que LoadImage no comprende. Tomé su archivo .bmp, lo cargué en Paint.net y lo volví a guardar. Una vez que hice eso, la imagen re-salvada se cargó con éxito.

En lugar de intentar cargar esto desde un archivo, tendría mucho más sentido vincular la imagen como un recurso y cargarla de esa manera.

Estoy escribiendo una función que rápidamente dibuja una imagen de un menú para un juego que estoy haciendo. Puedo dibujar bien los bloques de fondo y de texto, pero tengo problemas para crear una imagen de mapa de bits en la pantalla

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; }

A partir de ahora, la flecha es NULL y aparece el cuadro de texto Cargar imagen fallida. Estoy usando la ruta relativa de arrow.bmp. También intenté usar una ruta completa, que tampoco funcionó.

Puede haber notado que esta función está fuera del WndProc. Todo lo demás está bien. Traté de ejecutarlo allí también todo menos las cargas arrow.bmp.

¿Qué estoy haciendo mal para que arrow.bmp sea NULL? Tengo otros métodos que planeo ejecutar de manera similar, por lo que hacer funcionar esta función realmente sería de gran ayuda.

EDIT * Siempre que proporciono el nombre completo de la ruta, aún no se carga. ¿No es este el código apropiado para SO? Esta es mi primera pregunta ...

EDITAR ** Los ''/'' adicionales no han solucionado el problema.

EDIT *** Usando GetLastError, encontré que el código de error era 2, ERROR_FILE_NOT_FOUND