Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] [WinApi] Bitmapa się nie zmienia (nie wiem, jak opisać temat)

Ostatnio zmodyfikowano 2016-03-15 10:58
Autor Wiadomość
TheReclif
Temat założony przez niniejszego użytkownika
[C++] [WinApi] Bitmapa się nie zmienia (nie wiem, jak opisać temat)
» 2016-03-14 20:35:22
Witam!
Tworzę ostatnio api/silnik/bibliotekę, w której ma znajdować się coś podobnego do launchera, ale mocno uproszczone: launcher wyświetla logo silnika, po chwili logo gry, a potem elegancko wczytuje ustawienia z pliku i tworzy główne okno gry. Logo silnika wyświetla się, ale w momencie, gdy ma się zmienić wyświetlana bitmapa, to to się nie dzieje. Kod:
Rysowanie bitmap:
C/C++
case WM_CREATE:
{
    if( winType == WindowType::LAUNCHER_WINDOW )
    {
        WNDCLASSEX wndclass;
       
        wchar_t wndClassName[ 251 ] = L"";
       
        GetClassName( getHWND(), wndClassName, 250 );
       
        GetClassInfoEx( GetModuleHandle( NULL ), wndClassName, & wndclass );
       
        defaultBrush = wndclass.hbrBackground;
       
        tempBitmap1 =( HBITMAP ) LoadImageW( NULL, L"gamedata\\GameLauncherBitmap.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
       
        tempBitmap2 =( HBITMAP ) LoadImageW( NULL, L"enginedata\\GlowEngineLauncherBitmap.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
       
        if( tempBitmap1 == NULL )
        {
            wostringstream woss;
           
            DWORD error = GetLastError();
           
            woss << L"Failed to load tempBitmap1! Code error: " << error;
           
            GLOWE::ErrorMgr::getStdErrorMgr().throwError( woss.str(), L"[MODULE] - ParseMessage (WM_PAINT)" );
            break;
        }
       
        if( tempBitmap2 == NULL )
        {
            wostringstream woss;
           
            DWORD error = GetLastError();
           
            woss << L"Failed to load tempBitmap2! Code error: " << error;
           
            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;
       
        RECT wndRect;
       
        GetClientRect( getHWND(), & wndRect );
       
        if(( bool ) __GLOWE_WINDOW_ADDITIONAL_DATA == true )
        {
            _localtemp_oldbitmap_launcherSecondDC = SelectObject( launcherSecondDC, tempBitmap1 );
        }
        else
        {
            _localtemp_oldbitmap_launcherSecondDC = SelectObject( launcherSecondDC, tempBitmap2 );
        }
       
        FillRect( wndHdc, & wndRect, defaultBrush );
       
        BitBlt( wndHdc, 0, 0, 300, 100, launcherSecondDC, 0, 0, SRCCOPY );
       
        SelectObject( launcherSecondDC, _localtemp_oldbitmap_launcherSecondDC );
       
        DeleteDC( launcherSecondDC );
    }
   
    EndPaint( windowHandle, & paintStruct );
   
    break;
}
Zmiana bitmap:
C/C++
MSG msg;
Clock bitmapChangeClock;
bool done = false;

launcherWindow.setGloweAdditionalData(( LONG_PTR )( false ) );

SendMessage( launcherWindow.window.getHWND(), WM_PAINT, NULL, NULL );

while( !done )
{
    while( PeekMessage( & msg, launcherWindow.window.getHWND(), 0, 0, PM_REMOVE ) )
    {
        TranslateMessage( & msg );
        DispatchMessage( & msg );
    }
   
    if( bitmapChangeClock.getElapsedTime().asMiliseconds() >= 2350 )
    {
        done = true;
        GLOWE::LogMgr::getStdLogMgr() << L"[DEBUG] Elapsed 2,350 secs passed!";
    }
}

done = false;

launcherWindow.setGloweAdditionalData(( LONG_PTR )( true ) );

bitmapChangeClock.reset();

SendMessage( launcherWindow.window.getHWND(), WM_PAINT, NULL, NULL );

while( !done )
{
    while( PeekMessage( & msg, launcherWindow.window.getHWND(), 0, 0, PM_REMOVE ) )
    {
        TranslateMessage( & msg );
        DispatchMessage( & msg );
    }
   
    if( bitmapChangeClock.getElapsedTime().asMiliseconds() >= 3000 )
    {
        done = true;
        GLOWE::LogMgr::getStdLogMgr() << L"[DEBUG] Elapsed 3 secs passed!";
    }
}

Czemu to logo się nie zmienia (czyli czemu nie jest rysowana druga bitmapa)?
P-146018
j23
» 2016-03-15 10:58:16
To wysyłanie WM_PAINT przez SendMessage nie jest dobrym pomysłem. Jak chcesz wymusić wysłanie tego komunikatu, użyj UpdateWindow lub RedrawWindow.
P-146026
« 1 »
  Strona 1 z 1