C# - DoubleBuffer használata rajzoláshoz

forráskód letöltése
Egy Form, vagy kontrol területére történő rajzolás esetén szinte állandó probléma a megjelenő grafika villogása. Ez főleg akkor szembetűnő, ha egymás után sokszor kerül kirajzolásra ugyanaz (pl.: Form átméretezésekor), vagy esetleg folyamatosan változik a rajz.
Ennek elkerülése végett lett létrehozva az ún. DoubleBuffer, melynél a rajz egy háttér bufferre kerül és amikor kész, csak akkor jelenik meg a Form-on, egy lépésben. Így a folyamatos villogás megszűnik.
A megvalósítással már nem kell foglalkozunk, hiszen ez a DoubleBuffer adott minden programban, nekünk csak annyi a teendőnk, hogy be kell kapcsolni azt.
Minden Control osztályból származó objektumban rendelkezésre áll a SetStyle nevű függvény, melynek segítségével különböző stílusokat tudunk aktivizálni, illetve kikapcsolni.
SetStyle
Osztály: System.Windows.Forms.Control
protected void SetStyle(
ControlStyles flag,
bool value
);
A SetStyle segítségével megadható, hogy egy kontrolnál bekapcsolt legyen-e egy stílus, vagy sem.
Paraméterek
ControlStyles flag
A flag paraméterben egy ControlStyles felsorolt típus elemei közül választhatunk egyet. Ezzel adjuk meg, hogy melyik stílust kapcsoljuk be, vagy ki.
bool value
A value logikai típusú paraméterben szabályozhatjuk, hogy flag-ben megadott stílus be, vagy ki legyen kapcsolva.
Számunkra most a ControlStyles felsorolt típus elemei közül csak néhányra lesz szükségünk. A kulcs a problémánk megoldásához a DoubleBuffer stílus használatában van, viszont hogy ez működjön szükséges még néhány egyéb stílus használata is.
    public Form1()
    {
      InitializeComponent();
      this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
      this.SetStyle(ControlStyles.ResizeRedraw, true);
      this.SetStyle(ControlStyles.DoubleBuffer, true);
      this.SetStyle(ControlStyles.UserPaint, true);
    }
Az AllPaintingInWmPaint stílus bekapcsolásával megszüntetjük a WM_ERASEBKGND üzenet kezelését, így a háttér törlése elmarad.
A UserPaint stílus bekapcsolásával azt adjuk meg, hogy a kontrol kirajzolásáért a felhasználói alkalmazás felel.
E két stílus használata szükséges ahhoz, hogy a DoubleBuffer stílust használhassuk.
A Form konstruktorában megadtunk még egy stílust. Ez a ResizeRedraw, melyet akkor kell használnunk, ha azt szeretnénk elérni, hogy az adott kontrol - jelen esetben a Form - átméretezésekor automatikusan megtörténjen az újrarajzolás.
Ennyi előkészület után, ha menet közben szeretnénk a DoubleBuffer-t ki-be kapcsolni, akkor már elegendő a DoubleBuffer stílust állítani a többire nincs gond.
    private void checkBox1_CheckedChanged(object sender, System.EventArgs e)
    {
      this.SetStyle(ControlStyles.DoubleBuffer, checkBox1.Checked);
    }