grafika..pozbycie się migania

0

Witam, To może się każdemu przydać !!!!!!!!!!!

kiedyś poruszałem temat rysowania grafiki na formie..dokładniej na Panel..

  • rysowanie zdjęcia metodą e.graphics.drawImage obracanie z wykorzystaniem macierzy e.graphics.Transform = matrix trochę matematyki ale rysowanie odbywało zgodnie z sygnałem pochodzącym z czujników..

Jednym słowem animacja ... no i był problem... odswieżając te grafikę za pomocą Update() this.Invalidate();
this.Update();

cała froma z tymi obrazkami strasznie migała..w takt odświeżania grafiki...
Znalazłem 2 rozwiązania w końcu:

  1. ustawić Opacity formy na inną niż 100% (przy niektórych mmonitorACH 9x% nie robi różnicy..przy niektórych widać lekki prześwit.. BRAK MIGANIA :))

  2. wywołać funckję poniżej :

 public static void SetDoubleBuffered(Control control)
        {
            // set instance non-public property with name "DoubleBuffered" to true
            typeof(Control).InvokeMember("DoubleBuffered",BindingFlags.SetProperty | BindingFlags.Instance | BindingFlags.NonPublic,
                null, control, new object[] { true });
        }

control u mnie to Paint..
a dla niego nie można bezpośrednio ustawić DoubleBuffered na true... ten powyzszy zapis to wlasnie robi

efekt : BRAK MIGANIA

0

1' opacity na calym oknie nie bedzie dzialalo wszedzie (acz, racja, obecnie juz prawie wszedzie bedzie), poza tym, to nie to co chcesz uzyskac

2' Control.DoubleBuffered ma protected. jesli rysujesz po Panel, zrob sobie:

class MyPanel : Panel
{   public MyPanel() { DoubleBuffered = true; }
}

i postaw go na formie zamiast oryginalnego Panelu.. wlamywanie sie do kontrolek przez reflection zarezerwuj sobie na kontrolki ktore sa SEALED.. albo uzywaj sobie, tylko nie radz ludziom montowac zdjecie na scianie 15kilowym mlotkiem i 20cm gwozdziami :)

3' Invalidate/Update nalezy stosowac z glowa. jezeli Ndziesiat razy na sekunde nakazujesz przerysowanie calej kontorlki lub bron boze formy, to co sie dziwic ze miga bez DoubleBuffer'a kontrolek? jesli nie chcesz/nie mozesz/nie znasz DBuff, to NIE odswiezaj calosci, tylko region ktory sie zmienil ! BEZ czyszczenia calosci. samo 'nad'rysowywanie istniejacego obrauz nowymi kawalkami.

//@popcio - czym Wy sie podniecacie.. zwykle uzycie reflection bo komus na glowe slonce przyswiecilo jak pisal te klase i uczynil XYZ protected/private zamiast public... poza tym, nie "przeciazanie klasy" tylko "dziedziczenie"..

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