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: 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(): void OnPaint( HDC hdc, WCHAR * filename, int x, int y, int width, int height ) { Gdiplus::Graphics graphics( hdc ); Gdiplus::Image obrazekPNG( filename ); graphics.DrawImage( & obrazekPNG, x, y, width, height ); } |
|
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. |
|
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? |
|
j23 |
» 2016-07-31 18:07:58 Załaduj ją wcześniej, na przykład przy starcie aplikacji. |
|
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. |
|
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. |
|
mikson Temat założony przez niniejszego użytkownika |
» 2016-07-31 21:15:07 Zmieniłem to tak: WM_PAINTcase WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint( hwnd, & ps ); OnPaint( hdc, 0, 110, 800, 580 ); EndPaint( hwnd, & ps ); break; } OnPaint();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: Gdiplus::Image obrazekPNG( L"plik.png" );
No i nie rysuje się nic :p |
|
j23 |
» 2016-08-01 09:55:13 Pewnie bitmapa Ci się nie załadowała - sprawdź to. |
|
« 1 » 2 |