Forma, PaintEvent

0

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

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

W Formie dodaję funkcje do obsługi zdarzenia:

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:

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

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

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.

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ł.

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.

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