Delphi - Komponens területének villogásmentes újrarajzolása

forráskód letöltése
Ha készítünk egy olyan komponenst, melynek egyedi kinézetet biztosítunk és tartalma dinamikusan változik, akkor elég zavaró lehet, hogy állandóan újrarajzoltatjuk a képet amikor szükséges, mivel ez villogáshoz vezet. Mivel viszont az új tartalom csak az újrarajzolással jeleníthető meg, így ez a funkció kikerülhetetlen.

Erre az ellentmondásra keresünk megoldást a mellékelt komponensben. Ha készítünk egy olyan komponenst, melynek egyedi kinézetet biztosítunk és tartalma dinamikusan változik, akkor elég zavaró lehet, hogy állandóan újrarajzoltatjuk a képet amikor szükséges, mivel ez villogáshoz vezet. Mivel viszont az új tartalom csak az újrarajzolással jeleníthető meg, így ez a funkció kikerülhetetlen.

Erre az ellentmondásra keresünk megoldást a mellékelt komponensben.


A program megnyitása előtt a ColorControl.pas-ban lévő komponenst telepítenie kell a Delphi-be.

Létrehozunk egy olyan komponenst, mely kilenc egymás mellett álló négyzetből áll, melyeknek háttérszíne egymás után változik 0.1 másodpercenként.

Ha itt azt a módszert választanánk, hogy 0.1 másodpercenként újrarajzoltatnánk az egész komponenst az Invalidate paranccsal, akkor egy igen csak villogó komponenshez jutnánk. Ha ez a cél, akkor a megoldás tökéletes, ha viszont nem, akkor alkalmazzunk egy olyan trükköt, hogy csupán a komponensnek azt a területét érvénytelenítjük, amelyet szükségszerű újrarajzolni. Ebben az esetben annak a négyzetnek a területéről van szó, mely éppen az új színt kapja.

Ehhez az InvalidateRect függvényt kell használnunk. Itt első paraméterben a komponensünk azonosítóját kell megadni, majd az érvénytelenítendő négyzet területét TRect típusban, végül egy logikai értéket, mely azt szabályozza, hogy az adott terület legyen-e törölve újrarajzolás előtt vagy sem. Mivel mi amúgy is a teljes négyzet területét újraszínezzük ezért felesleges előtte törölni, így itt hamis értéket adunk meg.

Érvénytelenítés után, az UpdateWindow hívásával végeztethetjük el a rajzolást. Ekkor meghívásra kerül a komponens Paint eljárása, amely ugyan elvégzi a teljes komponens kirajzolását, de mivel ennek csak egy területe lett érvénytelenítve, így ezen területen kívül eső rajz rutinok figyelmen kívül maradnak.