Obraz jpg, rysowanie po Canvas formy

0

Witam szanowne grono użytkowników.

Moim problemem jest zachowanie wszystkiego co rysuję po Canvas formy gdy pod spodem znajduje się komponent Image z załadowanym obrazkiem jpg. Rysowanie wskazań kursora jako niewielkich kropek realizuję w procedurze, która wywoływana jest zdarzeniem OnClick na komponencie Image. Problem pojawia się gdy zawartość okna zostaje przerysowana wskutek (przysłonięcia formy innym oknem, maksymalizowania mojej formy, zmiany obrazka jpg w komponencie Image poprzez Button czy innych działań). Próbowałem w procedurze zdarzenia OnPaint dla Formy dodać wywołanie procedury rysującej oznaczenia co zakończyło się klapą - program uruchomiłem w trybie krokowym i widziałem jak od zdarzenia OnClick Buttona przechodzi przez wczytanie kolejnego obrazka do rysowania oznaczeń i zauważyłem, że choć wczytanie jpg nastąpiło przed rysowaniem to dopiero na samym końcu po opuszczeniu procedury zdarzenia OnPaint obrazek się zmienił wiec całe rysowanie się utraciło.
Proszę o radę jak ten problem przeskoczyć, szukałem czy można zmienić kolejność "odświeżania" komponentów po systemowym komunikacie WM_Paint bo gdyby ten obrazek wyświetlił się momencie tak jak w kodzie myślę nie byłoby problemu, ale chyba nie tędy droga. Próbowałem też dla zdarzenia OnProgress przechwycić kiedy wartość procentowa osiągnie 100 i dopiero wtedy wywołać rysowanie oznaczeń, ale podobnie jak wcześniej wartość 100 jest osiągana już przy odczytaniu obrazka a jego wyświetlenie dopiero na samym końcu.
Czytałem jak można zbudować nowy komponent, który miałby zdarzenie OnChange (którego brakuje w Image) bo liczę, że tutaj jest szansa. Jednak jestem na początkującym etapie i nie programuję obiektowo a jedynie wykorzystuję obiekty i sobie z tym nie radzę (nie rozumie).
Proszę o sugestie i rady.

0

Do wygodnego rysowania służy komponent TPaintBox, a nie TImage;

Użyj wewnętrznego buforowania, czyli dodatkowego obiektu typu TBitmap (24-bit); Na takiej bitmapie wszystko maluj, a na koniec w całości namaluj na formularzu czy w komponencie; Dzięki temu po pierwsze będzie o wiele szybciej niż bezpośrednio na płótnie kontrolki/formularza, a po drugie, nie utracisz zawartości wskutek przemalowania okna.

1 użytkowników online, w tym zalogowanych: 0, gości: 1