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

[GDI+] WM_PAINT a zacinanie programu

Ostatnio zmodyfikowano 2016-09-26 18:48
Autor Wiadomość
mikson
Temat założony przez niniejszego użytkownika
[GDI+] WM_PAINT a zacinanie programu
» 2016-07-30 19:33:49
Cześć,

Mam następujący problem: w moim programie WM_PAINT maluje obrazek przy pomocy biblioteki GDI+. Na pierwszy rzut oka wszystko działa, ale gdy przesuwam oknem przy granicy ekranu, zaczyna ono się zacinać, lagować i ogólnie bardzo ciężko przesuwać. Jaki może być powód czegoś takiego? Mój kod wygląda następująco:
WM_PAINT:
C/C++
case WM_PAINT:
{
    PAINTSTRUCT ps;
    HDC hdc;
    hdc = BeginPaint( hwnd, & ps );
    if( marysowac )
    {
        OnPaint( hdc, L"obrazek.png", 0, 0, 800, 580 );
    }
    EndPaint( hwnd, & ps );
    break;
}
OnPaint():
C/C++
void OnPaint( HDC hdc, WCHAR * filename, int x, int y, int width, int height )
{
    Gdiplus::Graphics graphics( hdc );
    Gdiplus::Image obrazekPNG( filename ); // obrazek
    graphics.DrawImage( & obrazekPNG, x, y, width, height );
}
P-150411
j23
» 2016-07-31 10:43:28
Wywal ładowanie obrazka z obsługi WM_PAINT, nie ma potrzeby, żebyś dziesiątki razy ładował i usuwał bitmapę z pamięci. Jeśli DrawImage przeskalowuje obrazek, to też powinieneś się zastanowić, czy to przeskalowywanie powinno odbywać się co każde wywołanie WM_PAINT. GDI+ nie jest tak szybkie, jak stare GDI - miej to na uwadze.
P-150431
mikson
Temat założony przez niniejszego użytkownika
» 2016-07-31 17:48:19
Wywal ładowanie obrazka z obsługi WM_PAINT
A gdzie mam w takim wypadku wstawić ładowanie obrazka, żeby wyjeżdżanie oknem poza ekran nie powodowało "zmazywania się" bitmapy? W osobny wątek?
P-150436
j23
» 2016-07-31 18:07:58
Załaduj ją wcześniej, na przykład przy starcie aplikacji.
P-150437
mikson
Temat założony przez niniejszego użytkownika
» 2016-07-31 18:16:29
Gdy wywołuję funkcję OnPaint(); wcześniej (jednorazowo), a nie w WM_PAINT, przy pierwszym lepszym przesunięciu okna wymazuje się ona.
P-150438
1aam2am1
» 2016-07-31 20:24:22
Rysuj jak rysujesz tylko ładuj raz zamiast nazwy obrazka przekazuj obiekt w którym jest załadowany obrazek.
P-150439
mikson
Temat założony przez niniejszego użytkownika
» 2016-07-31 21:15:07
Zmieniłem to tak:
WM_PAINT
C/C++
case WM_PAINT:
{
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint( hwnd, & ps );
    OnPaint( hdc, 0, 110, 800, 580 );
    EndPaint( hwnd, & ps );
    break;
}
OnPaint();
C/C++
void OnPaint( HDC hdc, int x, int y, int width, int height )
{
    Gdiplus::Graphics graphics( hdc );
    graphics.DrawImage( & obrazekPNG, x, y, width, height );
}
i na początku main.cpp dodane jeszcze:
C/C++
Gdiplus::Image obrazekPNG( L"plik.png" );
No i nie rysuje się nic :p
P-150440
j23
» 2016-08-01 09:55:13
Pewnie bitmapa Ci się nie załadowała - sprawdź to.
P-150450
« 1 » 2
  Strona 1 z 2 Następna strona