| TheReclif Temat założony przez niniejszego użytkownika | [C++] Rysowanie bitmapy w WinApi w komunikacie WM_PAINT nie działa » 2016-02-24 22:56:48 Witam! Ostatnio próbowałem napisać prosty launcher do gry. Miał proste zadanie: wczytać ustawienia, wyświetlić przez ok. 2 sekundy logo silnika po czym przez 3 sekundy logo gry, a na koniec stworzyć okienko gry i zniszczyć okienko launchera (launcher i gra są w tym samym pliku .exe). Nie miałem innej możliwości rysowania loga niż bitmapy w WinApi. Strzasznie to pogmatwane i na dodatek nie działa. Rysowanie zrobiłem w pętli komunikatów w komunikacie WM_PAINT: case WM_PAINT:{
 PAINTSTRUCT paintStruct;
 HDC wndHdc = BeginPaint( windowHandle, & paintStruct );
 
 if( winType == WindowType::LAUNCHER_WINDOW )
 {
 HDC launcherSecondDC = CreateCompatibleDC( wndHdc );
 
 HGDIOBJ _localtemp_oldbitmap_launcherSecondDC;
 
 static HBITMAP tempBitmap1 =( HBITMAP ) LoadImageW( NULL, L"gamedata\\GameLauncherBitmap.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
 
 static HBITMAP tempBitmap2 =( HBITMAP ) LoadImageW( NULL, L"enginedata\\GlowEngineLauncherBitmap.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
 
 if(( bool ) __GLOWE_WINDOW_ADDITIONAL_DATA == true )
 {
 _localtemp_oldbitmap_launcherSecondDC = SelectObject( launcherSecondDC, tempBitmap1 );
 }
 else
 {
 _localtemp_oldbitmap_launcherSecondDC = SelectObject( launcherSecondDC, tempBitmap2 );
 }
 
 BitBlt( wndHdc, 0, 0, 300, 100, launcherSecondDC, 0, 0, SRCCOPY );
 
 SelectObject( launcherSecondDC, _localtemp_oldbitmap_launcherSecondDC );
 
 DeleteDC( launcherSecondDC );
 }
 
 EndPaint( windowHandle, & paintStruct );
 
 break;
 }
 
Kod działa i TEORETYCZNIE powinien swoją rolę spełniać. Ale teoria to nie rzeczywistość. Program zamiast wyświetlić jakiekolwiek logo wyświetla tylko okienko 300 na 100 (takie miało być) z granatowym (taki kolor odświeżania wybrałem) tłem. Czy dobrze zrobiłem rysowanie? Co jest nie tak? Z góry dzięki za odpowiedzi i piszcie, gdyby do rozwiązania mojego problemu były potrzebne jakieś inne informacje/więcej kodu. | 
|  | 
| j23 | » 2016-02-25 10:54:56 Kod wygląda OK. Sprawdzałeś, czy bitmapy się ładują? | 
|  | 
| TheReclif Temat założony przez niniejszego użytkownika | » 2016-03-02 14:35:23 Jak można to sprawdzić? | 
|  | 
| j23 | » 2016-03-02 19:23:48 Debuggerem na przykład. Ustaw breakpointa i sprawdź, jaką wartość mają tempBitmap1 i tempBitmap2 po wywołaniu LoadImageW. | 
|  | 
| TheReclif Temat założony przez niniejszego użytkownika | » 2016-03-05 01:46:35 Sprawdziłem debuggerem i na wszelki wypadek zrobiłem jeszcze warunek, który wyświetla błąd, jeżeli któraś z bitmap jest równa NULL. Okazuje się, że po wywołaniu LoadImageW bitmapy są równe NULL, a kiedy próbuję pobrać ostatni znany błąd przy użyciu GetLastError okazuje się, że jest on równy... 0, czyli obecny wątek nie zgłosił jeszcze żadnego błędu! Przypatrywałem się funkcjom w Internecie np. na stackoverflow i moja jest całkowicie w porządku. Przez to jestem sfrustrowany, bo nie mam zielonego pojęcia, co z tym kodem może być źle. | 
|  | 
| j23 | » 2016-03-05 10:55:31 Podaj pełne ścieżki do bitmap, bo ze względnymi różnie bywa. | 
|  | 
| TheReclif Temat założony przez niniejszego użytkownika | » 2016-03-05 13:28:37 Zmieniłem kod w ten sposób (obecna wersja): case WM_CREATE:{
 tempBitmap1 =( HBITMAP ) LoadImageW( NULL, L"C:\\Users\\TheReclif\\Source\\Workspaces\\Lift\\Lift\\Lift\\x64\\Debug\\gamedata\\GameLauncherBitmap.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
 
 tempBitmap2 =( HBITMAP ) LoadImageW( NULL, L"C:\\Users\\TheReclif\\Source\\Workspaces\\Lift\\Lift\\Lift\\x64\\Debug\\enginedata\\GlowEngineLauncherBitmap.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
 
 if( tempBitmap1 == NULL )
 {
 wostringstream woss;
 
 woss << L"Failed to load tempBitmap1! Code error: " << GetLastError();
 
 GLOWE::ErrorMgr::getStdErrorMgr().throwError( woss.str(), L"[MODULE] - ParseMessage (WM_PAINT)" );
 break;
 }
 
 if( tempBitmap2 == NULL )
 {
 wostringstream woss;
 
 woss << L"Failed to load tempBitmap2! Code error: " << GetLastError();
 
 GLOWE::ErrorMgr::getStdErrorMgr().throwError( woss.str(), L"[MODULE] - ParseMessage (WM_PAINT)" );
 break;
 }
 break;
 }
 case WM_PAINT:
 {
 PAINTSTRUCT paintStruct;
 HDC wndHdc = BeginPaint( windowHandle, & paintStruct );
 
 if( winType == WindowType::LAUNCHER_WINDOW )
 {
 HDC launcherSecondDC = CreateCompatibleDC( wndHdc );
 
 HGDIOBJ _localtemp_oldbitmap_launcherSecondDC;
 
 if(( bool ) __GLOWE_WINDOW_ADDITIONAL_DATA == true )
 {
 _localtemp_oldbitmap_launcherSecondDC = SelectObject( launcherSecondDC, tempBitmap1 );
 }
 else
 {
 _localtemp_oldbitmap_launcherSecondDC = SelectObject( launcherSecondDC, tempBitmap2 );
 }
 
 BitBlt( wndHdc, 0, 0, 300, 100, launcherSecondDC, 0, 0, SRCCOPY );
 
 SelectObject( launcherSecondDC, _localtemp_oldbitmap_launcherSecondDC );
 
 DeleteDC( launcherSecondDC );
 }
 
 EndPaint( windowHandle, & paintStruct );
 
 break;
 }
 
Problem pozostał ten sam. | 
|  | 
| j23 | » 2016-03-05 15:16:22 Gdzie zdefiniowałeś tempBitmap1  i tempBitmap2 ? A propos ścieżek. Możesz użyć względnych, ale dla pewności ustaw aktualny katalog na właściwy: WCHAR path[ MAX_PATH ];
 GetModuleFileNameW( NULL, path, MAX_PATH );
 * wcsrchr( path, L'\\' ) = L'\0';
 SetCurrentDirectoryW( path );
 
 
 tempBitmap1 =( HBITMAP ) LoadImageW( NULL, L"gamedata\\GameLauncherBitmap.bmp",...);
 tempBitmap2 =( HBITMAP ) LoadImageW( NULL, L"enginedata\\GlowEngineLauncherBitmap.bmp",...);
 
 ...
 
 | 
|  | 
| « 1 »  2 |