Krzychu97 Temat założony przez niniejszego użytkownika |
[C++ WinAPI] Bitmapa » 2016-12-30 03:35:07 Witam! Mam problem z wczytaniem bitmapy. Próbowałem dowiedzieć się co może źle działać więc umieściłem w kodzie funkcję GetLastError() która zwraca mi wartość 0 co oznacza że wszystko działa dobrze. Pomimo tego nadal w oknie nie ma bitmapy. #include <windows.h> #include <stdio.h>
using namespace std; HWND Okno; HBITMAP bitmapa; BITMAP info_bitmapy;
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR lStart, INT nShow ) { bitmapa =( HBITMAP ) LoadImage( 0, "D:\\CodeBlock Projekty\\Bitmapa\\BMP.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); if( bitmapa == 0 ) { char msg_text[ 256 ]; sprintf( msg_text, "%i", GetLastError() ); MessageBox( Okno, msg_text, "Komunikat", MB_OK ); } GetObject( bitmapa, sizeof( BITMAP ), & info_bitmapy ); WNDCLASSEX wc; wc.hInstance = hInst; wc.lpszClassName = "Klasa okna"; wc.lpfnWndProc = WndProc; wc.style = CS_DBLCLKS; wc.cbSize = sizeof( WNDCLASSEX ); wc.hIcon = LoadIcon( 0, IDI_APPLICATION ); wc.hIconSm = LoadIcon( 0, IDI_APPLICATION ); wc.hCursor = LoadCursor( 0, IDC_ARROW ); wc.lpszMenuName = 0; wc.hbrBackground =( HBRUSH ) GetStockObject( WHITE_BRUSH ); wc.cbWndExtra = 0; wc.cbClsExtra = 0; if( RegisterClassEx( & wc ) == 0 ) return 0; HWND Okno = CreateWindowEx( 0, "Klasa okna", "Tytu³ okna", WS_OVERLAPPEDWINDOW, 50, 50, 800, 600, 0, 0, hInst, 0 ); MSG msgs; ShowWindow( Okno, nShow ); UpdateWindow( Okno ); while( GetMessage( & msgs, 0, 0, 0 ) ) { TranslateMessage( & msgs ); DispatchMessage( & msgs ); } DeleteObject( bitmapa ); return msgs.wParam; }
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wPar, LPARAM lPar ) { HDC hdc, hdcBitmapy; PAINTSTRUCT ps; switch( msg ) { case WM_PAINT: hdc = BeginPaint( hwnd, & ps ); hdcBitmapy = CreateCompatibleDC( hdc ); bitmapa =( HBITMAP ) SelectObject( hdcBitmapy, bitmapa ); BitBlt( hdc, 0, 0, info_bitmapy.bmWidth, info_bitmapy.bmHeight, hdcBitmapy, 0, 0, SRCCOPY ); bitmapa =( HBITMAP ) SelectObject( hdcBitmapy, bitmapa ); DeleteDC( hdcBitmapy ); EndPaint( hwnd, & ps ); break; case WM_DESTROY: PostQuitMessage( 0 ); break; default: return DefWindowProc( hwnd, msg, wPar, lPar ); } return 0; }
|
|
j23 |
» 2016-12-30 11:08:06 info_bitmapy zawiera oczekiwane dane? |
|
Krzychu97 Temat założony przez niniejszego użytkownika |
» 2016-12-30 15:02:04 Spróbowałem tego kodu: bitmapa =( HBITMAP ) LoadImage( 0, "D:\\CodeBlock Projekty\\F4\\BMP.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); GetObject( bitmapa, sizeof( BITMAP ), & info_bitmapy ); char msg_text[ 256 ]; sprintf( msg_text, "GetWindowText failed -> %i", info_bitmapy.bmWidth ); MessageBox( Okno, msg_text, "Komunikat", MB_OK );
i otrzymałem odpowiedz GetWindowText failed -> 0. Bitmapa ma wymiary 300 na 300. Próbowałem jeszcze wczytać ją bez funkcji wczytującej rozmiar bitmapy podając odpowiednie wartości jako argumenty dla BitBlt (zamiast info_bitmapy.bmWidth,info_bitmapy.bmHeight podałem 300, 300) ale też nie przyniosło to żadnych rezultatów. |
|
j23 |
» 2016-12-30 18:30:36 Dobra, jeszcze raz. Czy LoadImage zwraca uchwyt do bitmapy (czy NULL)?
|
|
Krzychu97 Temat założony przez niniejszego użytkownika |
» 2016-12-31 16:50:22 Wykonuje mi się kod w tym if: if( bitmapa == 0 ) { char msg_text[ 256 ]; sprintf( msg_text, "%i", GetLastError() ); MessageBox( Okno, msg_text, "Komunikat", MB_OK ); }
więc zwraca NULL. |
|
j23 |
» 2016-12-31 18:10:53 I GetLastError zwraca 0? Spróbuj z flagą LR_CREATEDIBSECTION. |
|
Krzychu97 Temat założony przez niniejszego użytkownika |
» 2017-01-02 00:35:14 Tak GetLastError zwraca zero. Zamieniłem flagę i teraz zwraca 1814. ERROR_RESOURCE_NAME_NOT_FOUND 1814 (0x716) The specified resource name cannot be found in the image file. Uprzedzając pytanie czy dany plik istnieje: bitmapa =( HBITMAP ) LoadImage( 0, "D:\\CodeBlock Projekty\\SXSXSXSXSXSX\\BMP.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
https://zapodaj.net/0ad8e06b06dbd.png.html |
|
j23 |
» 2017-01-02 10:52:56 No ale dlaczego usunąłeś flagę LR_LOADFROMFILE? Obie powinny tam być. |
|
« 1 » 2 |