Forma, PaintEvent

JK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 55
0

Mam funkcję, i chcę, aby ta funkcja wyrysowała mi kilka stringów na początku działania programu.

Kopiuj
public static void DrawDescriptions(Appearance appearance, PaintEventArgs e)
{
...
}

W Formie dodaję funkcje do obsługi zdarzenia:

Kopiuj
private void Form1_Paint(object sender, PaintEventArgs e)
{
       Drawing.DrawDescriptions(_appearance, e);
}

I wszystko niby działa, ale to zdarzenie wywołuje się wielokrotnie, podczas inicjalizacji programu, i wielokrotnie podczas działania programu. I nie wiem, czy słusznie postrzegam to jako coś niepożądanego. Wolałbym, aby to zdarzenie wywołało się tylko jeden raz - wyrysowało mi to co trzeba i już (choć być może nie do końca rozumiem, jak to działa)

Wydaje się, że można rozwiązać to pisząc w odpowiednim momencie:

Kopiuj
this.Paint -= new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);

Ale nie wiem, czy to właściwe postępowanie.

mariano901229
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 597
0

Obsługa zdarzenia Paint jest wykonywana wielokrotnie kiedy rysowane i odświeżane są kontrolki formy (te które zostały w niej użyte). Pytanie dlaczego nie użyjesz jakiejś Bitmapy i nie wsadzisz jej do obiektu PictureBox.

JK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 55
0

Ale jeśli chcę móc określać te rysunki na podstawie danych, które być może będzie mógł wprowadzić użytkownik ?

No bo z tego co zauważyłem, to jak raz coś narysuje, to w zasadzie już nie muszę tego rysować ponownie, więc to co chcę osiągnąć to:

Definiuję metodę, która ma mi coś narysować (jej parametrem jest PaintEventArgs). Metodę tę jak dotąd udało mi się tylko wywołać z pozytywnym efektem w przypadku kiedy jest wywolywany event Paint.
I chce aby to wyglądało tak:
wywołuje się event Paint, rysuję to co chcę, event czynię nieaktywnym i nie chcę aby kiedykolwiek się jeszcze wywołał.

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
0

I wszystko niby działa, ale to zdarzenie wywołuje się wielokrotnie, podczas inicjalizacji programu, i wielokrotnie podczas działania programu.

Zdarzenie odpowiedzialne za rysowanie formy. Jest wykonywane wielokrotnie.
To dopiero niespodzianka.

Przy wyłączonym WDM (Windows Desktop Manager) — czyli w XP i starszych zawsze, a w Viście i 7 gdy wyłączone jest Aero — okno jest odrysowywane zawsze, gdy jest odsłonięte przez odsunięcie innego okna które je zasłaniało, gdy jest przywracane ze stanu zminimalizowanego, gdy jest wysunięte zza ekranu. Windows nie trzymał żadnego “cache” z zawartością okna. Istnieje tylko to co jest na ekranie, więc jeśli coś ma się na nim pojawić to musi być odrysowane.
Jeśli jest włączony WDM (pod Vistą i 7 włączone Aero, od 8 wzwyż przez cały czas) zdarzenie Paint jest wykonywane rzadziej, bo system przechowuje zawartość okna jako bitmapę którą wkleja w odpowiednie miejsce (tym miejscem może być samo okno, albo jakaś miniaturka na pasku zadań, pod alt+tab itp).

Czy jedno czy drugie, nie masz wpływu na to kiedy wyskakuje zdarzenie. Możesz użyć kontrolki PictureBox jak @mariano901229 poradził, ale to zmieni tylko tyle, że PictureBox będzie trzymał kopię bitmapy, którą i tak będzie rysował na ekranie za każdym Paint.
Może się to okazać szybsze, może wolniejsze, zależnie od charakteru obrazka.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.