czwartek, 14 lutego 2013

C#: event Paint z kontrolki TextBox

Ostatnio mam okazję pobawić się z WinForms i pięknymi kontrolkami. W C# jest z nimi faktycznie ciekawie, ponieważ część kontrolek jest częścią .NET i są tam rysowane i w pełni obsługiwane, a część to tylko wrappery na kontrolkach systemowych. Dotyczy to na przykład kontrolki DateTimePicker, ale też najprostszej, czyli TextBox. Potrzebowałem reagować na odrysowywanie pewnego TextBox'a na formularzu i udało mi się z tym uporać.

 Wcale nie było to takie oczywiste na samym początku. Oczywiście rozwiązanie jak zawsze jest proste i jak zwykle sprowadziło się do stworzenia własnej kontrolki. Tyle że to tworzenie było banalne i moją przeciążoną kontrolkę ciężko nazwać nową.

Kontrolki mają chronioną metodę WndProc, która odpowiada za obsługę systemowych zdarzeń jakie trafiają do kontrolki. Cała sztuczka polega na przeciążeniu metody. Robimy to jednak w  taki sposób, że pozostaje pierwotna obsługa, ale w przypadku message'a Paint (0x0F) dostajemy wewnętrznie event Paint. Całość wygląda tak:

protected override void WndProc(ref System.Windows.Forms.Message m)
{
    base.WndProc(ref m);
    if(m.Msg == 0x0F)
        OnPaint(new System.Windows.Forms.PaintEventArgs(CreateGraphics(), ClientRectangle));
}


To jest jedyna metoda jaka jest przeciążona w klasie. Oczywiście nie ma problemu aby rozwijać tę kontrolkę dalej dodając kolejne rozszerzenia.

Czytaj też:

Brak komentarzy:

Prześlij komentarz