Formanty rysowane przez użytkownika

Program .NET Framework zapewnia możliwość łatwego tworzenia własnych kontrolek. Możesz utworzyć kontrolkę użytkownika, która jest zestawem standardowych kontrolek powiązanych ze sobą za pomocą kodu, lub możesz zaprojektować własną kontrolkę od podstaw. Można nawet użyć dziedziczenia, aby utworzyć kontrolkę dziedziczoną z istniejącej kontrolki i dodać do jej nieodłącznej funkcjonalności. Niezależnie od używanego podejścia platforma .NET Framework udostępnia funkcje do rysowania niestandardowego interfejsu graficznego dla każdej tworzonej kontrolki.

Malowanie kontrolki jest wykonywane przez wykonanie kodu w metodzie kontrolki OnPaint . Pojedynczy argument OnPaint metody to PaintEventArgs obiekt, który udostępnia wszystkie informacje i funkcje wymagane do renderowania kontrolki. Element PaintEventArgs udostępnia jako właściwości dwóch głównych obiektów, które będą używane w renderowaniu kontrolki:

  • ClipRectangle object — prostokąt reprezentujący część kontrolki, która zostanie narysowana. Może to być cała kontrolka lub część kontrolki w zależności od sposobu rysowania kontrolki.

  • Graphics object — hermetyzuje kilka obiektów i metod zorientowanych na grafikę, które zapewniają funkcjonalność niezbędną do rysowania kontrolki.

Aby uzyskać więcej informacji na Graphics temat obiektu i sposobu jego używania, zobacz How to: Create Graphics Objects for Drawing (Instrukcje: tworzenie obiektów graficznych na potrzeby rysunku).

Zdarzenie jest wyzwalane za każdym razem, gdy kontrolka OnPaint zostanie narysowana lub odświeżona na ekranie, a ClipRectangle obiekt reprezentuje prostokąt, w którym nastąpi malowanie. Jeśli należy odświeżyć całą kontrolkę, ClipRectangle będzie reprezentować rozmiar całej kontrolki. Jeśli jednak należy odświeżyć tylko część kontrolki, obiekt będzie reprezentować tylko region, ClipRectangle który musi zostać ponownie narysowany. Przykładem takiego przypadku może być sytuacja, gdy kontrolka została częściowo zasłonięta przez inną kontrolkę lub formularz w interfejsie użytkownika.

Podczas dziedziczenia Control z klasy należy przesłonić metodę OnPaint i udostępnić kod renderowania grafiki w programie . Jeśli chcesz udostępnić niestandardowy interfejs graficzny do kontrolki użytkownika lub odziedziczonej kontrolki, możesz to również zrobić, przesłaniając metodę OnPaint . Przykład przedstawiono poniżej:

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)  
   ' Call the OnPaint method of the base class.  
   MyBase.OnPaint(e)  
  
   ' Declare and instantiate a drawing pen.  
   Using myPen As System.Drawing.Pen = New System.Drawing.Pen(Color.Aqua)  
      ' Draw an aqua rectangle in the rectangle represented by the control.  
      e.Graphics.DrawRectangle(myPen, New Rectangle(Me.Location, Me.Size))  
   End Using
End Sub  
protected override void OnPaint(PaintEventArgs e)  
{  
   // Call the OnPaint method of the base class.  
   base.OnPaint(e);  
  
   // Declare and instantiate a new pen.  
   using (System.Drawing.Pen myPen = new System.Drawing.Pen(Color.Aqua))  
   {
      // Draw an aqua rectangle in the rectangle represented by the control.  
      e.Graphics.DrawRectangle(myPen, new Rectangle(this.Location,
         this.Size));  
   }
}  

W poprzednim przykładzie pokazano, jak renderować kontrolkę z bardzo prostą reprezentacją graficzną. Wywołuje OnPaint metodę klasy bazowej, tworzy Pen obiekt, z którym ma być rysowany, a na koniec rysuje wielokropek w prostokątze określonym przez Location kontrolkę i Size . Chociaż większość kodu renderowania będzie znacznie bardziej skomplikowana, w tym przykładzie pokazano użycie Graphics obiektu zawartego PaintEventArgs w obiekcie. Należy pamiętać, że jeśli dziedziczysz z klasy, która ma już graficzną reprezentację, taką jak UserControl lub Button, i nie chcesz dołączać tej reprezentacji do renderowania, nie należy wywoływać metody klasy bazowej OnPaint .

Kod w OnPaint metodzie kontrolki zostanie wykonany po pierwszym narysowanym kontrolce i za każdym razem, gdy zostanie odświeżony. Aby upewnić się, że kontrolka jest ponownie rysowana przy każdej zmianie rozmiaru, dodaj następujący wiersz do konstruktora kontrolki:

SetStyle(ControlStyles.ResizeRedraw, True)  
SetStyle(ControlStyles.ResizeRedraw, true);  

Uwaga

Control.Region Użyj właściwości , aby zaimplementować kontrolkę niekątną.

Zobacz też