Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym artykule przedstawiono niestandardowe kontrolki i opisano, jak różnią się one od kontrolek użytkownika. Kontrolki niestandardowe nie zapewniają wizualnej powierzchni projektowej i opierają się na kodzie użytkownika do samodzielnego rysowania. Ten projekt różni się od kontrolek użytkownika, które zapewniają wizualną powierzchnię projektową w celu grupowania wielu kontrolek w jedną jednostkę wielokrotnego użytku.
Użyj kontrolek niestandardowych, gdy istniejąca kontrolka lub kontrolka użytkownika nie zbliża się do zapewnienia wymaganego interfejsu użytkownika lub interakcyjności. Wymagają one większego nakładu pracy w celu pełnego wdrożenia. Windows Forms nadal zapewnia obsługę klawiatury i myszy, ale musisz zaimplementować wszelkie konkretne zachowania. Kontrolka niestandardowa nie zawiera powierzchni projektowej, ponieważ cały rysunek realizowany jest za pomocą kodu w metodzie OnPaint. Nadal można wciąż dodawać komponenty, takie jak Timer, za pomocą projektowej powierzchni niewidocznej.
Klasa bazowa
Podczas tworzenia kontrolki niestandardowej wybierz jedną z dwóch klas bazowych:
-
Ta klasa bazowa jest taka sama, która jest używana przez inne kontrolki Windows Forms. Bezpośrednio kontrolujesz dane wejściowe i wyjściowe kontrolki.
System.Windows.Forms.ScrollableControl
Ta klasa bazowa jest używana przez niektóre kontrolki Windows Forms.
Controlrozszerza się, dodając możliwość przewijania zawartości.
Jeśli nie musisz przewijać zawartości kontrolki niestandardowej, użyj Control jako klasy bazowej.
Funkcje dziedziczone
Ponieważ klasa podstawowa kontrolki niestandardowej to Control, automatycznie dziedziczysz funkcje formularzy systemu Windows współużytkowane przez wszystkie kontrolki. Poniżej przedstawiono kilka funkcji dostępnych za pomocą kontrolki niestandardowej:
- Klawiatura i wejście myszy.
- Zachowania układu, takie jak zakotwiczenie (umiejscowienie elementu względem krawędzi) i zadokowanie (przytwierdzenie elementu do określonej pozycji).
- Obsługa tabulacji.
- Minimalne i maksymalne ograniczenia rozmiaru.
Malarstwo
Malowanie oznacza rysowanie wizualizacji kontrolki. Aby zrealizować to zadanie, musisz nadpisać metodę OnPaint. Aby uzyskać więcej informacji na temat sposobu, w jaki kontrolki są malowane, prosimy o zapoznanie się z Malowanie i rysowanie na kontrolkach.
Podczas tworzenia kontrolki niestandardowej przy użyciu szablonów programu Visual Studio automatycznie zastąpisz metodę OnPaint . Szablon robi to, ponieważ musisz napisać kod, który tworzy interfejs sterujący. Oto przykład tego, co generuje szablon:
public partial class CustomControl1 : Control
{
public CustomControl1()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
}
}
Public Class CustomControl1
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
'Add your custom paint code here
End Sub
End Class
Namaluj kontrolkę niestandardową przy użyciu metody OnPaint. Ta metoda przyjmuje jeden argument, PaintEventArgs obiekt, który udostępnia wszystkie informacje i funkcje potrzebne do renderowania kontrolki.
PaintEventArgs Udostępnia dwie właściwości używane w renderowaniu kontrolki:
PaintEventArgs.ClipRectangle— reprezentuje część kontrolki, która musi zostać ponownie wyrysowana. Ta część może być całym elementem sterującym lub tylko jego sekcją.
Graphics— reprezentuje graficzną powierzchnię kontrolki. Udostępnia on kilka obiektów i metod zorientowanych na grafikę, które zapewniają funkcjonalność niezbędną do rysowania kontrolki.
Metoda OnPaint jest wywoływana za każdym razem, gdy kontrolka jest rysowana lub odświeżona na ekranie, a PaintEventArgs.ClipRectangle obiekt reprezentuje prostokąt, w którym odbywa się malowanie. Jeśli należy odświeżyć całą kontrolkę, PaintEventArgs.ClipRectangle reprezentuje rozmiar całej kontrolki. Jeśli należy odświeżyć tylko część kontrolki, oznacza to, że tylko region, który wymaga ponownego wyrysowania, jest reprezentowany. Przykładem takiego przypadku może być sytuacja, gdy kontrolka jest częściowo zasłonięta przez inną kontrolkę w interfejsie użytkownika, a inna kontrolka zostanie przeniesiona, nowo uwidoczniona część kontrolki poniżej musi zostać ponownie wyrysowana.
Kod w OnPaint metodzie kontrolki jest uruchamiany, gdy kontrolka jest najpierw rysowana i za każdym razem, gdy jest ona unieważniona. Aby upewnić się, że kontrolka jest ponownie rysowana przy każdym zmianie rozmiaru, dodaj następujący wiersz do konstruktora kontrolki:
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.ResizeRedraw, True)
Przykład
Poniższy fragment kodu to niestandardowa kontrolka, która renderuje wiele kolorowych prostokątów wokół krawędzi kontrolki.
protected override void OnPaint(PaintEventArgs pe)
{
Rectangle rect = this.ClientRectangle;
// Bring the width/height in by 1 pixel so the rectangle is drawn inside the control.
// Otherwise, it kind of overlaps the outside edge.
rect.Width -= 1;
rect.Height -= 1;
Pen[] colorPens = new Pen[] { Pens.Blue, Pens.BlueViolet,
Pens.AliceBlue, Pens.CornflowerBlue,
Pens.Cyan, Pens.DarkCyan };
foreach (Pen pen in colorPens)
{
pe.Graphics.DrawRectangle(pen, rect);
rect.Inflate(-1, -1);
}
// Raise the Paint event so users can custom paint if they want.
base.OnPaint(pe);
}
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
Dim rect As Rectangle = Me.ClientRectangle
'Bring the width/height in by 1 pixel so the rectangle is drawn inside the control.
'Otherwise, it kind of overlaps the outside edge.
rect.Width -= 1
rect.Height -= 1
Dim colorPens As Pen() = {Pens.Blue, Pens.BlueViolet,
Pens.AliceBlue, Pens.CornflowerBlue,
Pens.Cyan, Pens.DarkCyan}
For Each curPen As Pen In colorPens
e.Graphics.DrawRectangle(curPen, rect)
rect.Inflate(-1, -1)
Next
'Raise the Paint event so users can custom paint if they want.
MyBase.OnPaint(e)
End Sub
Powyższy kod tworzy kontrolkę, która wygląda jak na poniższej ilustracji:
Kontekst
Zwróć uwagę, że tło kontrolki jest malowane kolorem SystemColors.Control , mimo że OnPaint kod nie czyści ani nie wypełnia kontrolki kolorem. Metoda OnPaintBackground(PaintEventArgs) maluje tło przed wywołaniem metody OnPaint. Zastąpij OnPaintBackground , aby obsłużyć rysowanie tła kontrolki. Domyślna implementacja tej metody rysuje kolor i obraz ustawione przez właściwości BackColor i BackgroundImage.
Treści powiązane
.NET Desktop feedback