Rozumiem, że tworzę bitmapę, którą dodaję "na spód".
Tzn. tworzysz bitmapkę i trzymasz ją wyłacznie w pamięci - nigdzie jej nie umieszczasz. Ona sobie istnieje w pamięci, więc malowanie na niej nie jest powiązane z odświeżaniem ekranu (tego co widać na monitorze), dzięki czemu malowanie jest efektywne.
I bitmapa nie jest odświeżana w momencie wywołania metody Repaint/Refresh/Invalidate?
Bitmapa musi być odświeżana po każdej modyfikacji dokumentu. Po każdej modyfikacji wpływającej na to co znajduje się na ekranie, np. po zmianie koloru elementu, po zmianie ich kolejności, ukryciu lub pokazaniu, po włączeniu/wyłączeniu warstwy (jeśli nie była pusta), po zmianie kolejności warstw itd. Jeśli zmiana musi być widoczna dla użytkownika, to należy wyrenderować obraz ponownie (w całości na bitmapie pomocniczej) i odmalować komponent, aby zmiany zostały wprowadzone na ekran.
Jeśli chodzi o samo odmalowanie komponentu to zawsze wywołuj metodę Invalidate
. Ona posiada w sobie szereg zabezpieczeń, więc jest bezpieczna w użyciu. Implementacja tej metody w VCL i LCL może się różnić, jednak jej zadanie jest to samo – odmalować kontrolkę tylko wtedy, gdy jest to możliwe.
Czyli mogę tworzyć w ten sposób warstwy.
System warstw dokumentu możesz zrealizować naprawdę na wiele sposobów. To co podałem dotyczy wyłącznie kontenerów umożliwiających stworzenie drzewiastej struktury, z podziałem dokumentu na warstwy, a te na elementy. I to w zupełności wystarczy do prostego edytora/viewera – zapewnioną masz możliwość tworzenia wielu dokumentów, w nich wielu warstw (plus operacje na nich, np. zmiana kolejności), a w nich wielu elementów (i tak samo – opcje dodawania, usuwania, zmiany kolejności itd.).
Gołe listy raczej nie wystarczą, dlatego że dokument to nie tylko zbiór warstw, a warstwy to nie tylko zestawy elementów do nich należących. Na przykładzie funkcjonalności programu Inkscape, opis dokumentu to mnóstwo innych informacji, jak np. rozmiar w danej jednostce, dane dotyczące tła, metadane czy licencja. Natomiast warstwa – oprócz listy elementów – posiadać może również swoją nazwę, co jest raczej oczywiste.
Strukturę dokumentu i jego podział na części składowe, powinieneś dobrać na podstawie określonej funkcjonalności programu. Tak więc najpierw określ sobie to co program ma umożliwiać i jak już to będziesz miał rozpisane, wtedy zajmij się kodem.
Jeżeli to się zgadza to mogę tworzyć bitmapę przesuwanych wektorów i ją przesuwać? Wtedy nie trzeba generować linii przy każdym MouseMove :)
Bitmapa ma służyć jedynie do renderowania ekranu w tle, aby uniknąć migania ekranu. Zawartość tej bitmapy ma dokładnie odpowiadać temu, co użytkownik ma widzieć na ekranie. Wszystkie elementy zawarte w dokumencie powinieneś mieć opisane obiektami i zawarte w drzewku.
Podczas obsługi komunikatu myszy nie musisz odświeżać ekranu, dlatego że malowaniem tego co znajduje się w kontrolce pod kursorem zajmuje się system. Jeśli przesuniesz nad komponentem okno to też wszystkim zajmie się system. Renderować obraz musisz tylko wtedy, kiedy coś wizualnie zmienia się w komponencie, np. jeśli przesuwasz element po ekranie, jeśli go rozciągasz lub zmieniasz jego kolor.
No i też nie polecałbym podpinać się pod komponent typu TPaintBox
– to nie jest zbyt dobre rozwiązanie. Lepiej będzie jak stworzysz własną kontrolkę od podstaw i w niej zaimplementujesz całą funkcjonalność. W bazowej klasie – np. TCustomControl
– jest już podstawowa funkcjonalność, metoda Paint
czy popularne zdarzenia, więc możesz łatwo je nadpisać. Plusem będzie też możliwości utworzenia kilku instancji takich komponentów, dzięki czemu Twój program będzie mógł obsługiwać wiele dokumentów, np. w postaci zakładek.