Uwaga
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. Różni się to od kontrolek użytkownika, które zapewniają wizualną powierzchnię projektową do grupowania wielu kontrolek w jedną jednostkę do ponownego użycia.
Kontrolki niestandardowe są używane, 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. Obsługa klawiatury i myszy jest nadal zapewniana przez Windows Forms, ale implementacja wszelkich zachowań należy już do Ciebie. Nie ma powierzchni projektowej dostarczanej z kontrolką niestandardową, ponieważ cały rysunek odbywa się za pomocą kodu w metodzie OnPaint . Składniki, takie jak Timer, można nadal dodawać za pośrednictwem powierzchni projektowej niewizualnej.
Klasa bazowa
Istnieją dwie klasy podstawowe do wyboru podczas tworzenia kontrolki niestandardowej:
-
Jest to ta sama klasa bazowa używana przez inne kontrolki Windows Forms. Dane wejściowe i wyjściowe kontrolki można kontrolować bezpośrednio.
System.Windows.Forms.ScrollableControl
Niektóre kontrolki Windows Forms używają tej klasy bazowej. Ta klasa rozszerza
Control
, 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, co oznacza narysowanie wizualnej reprezentacji kontrolki, odbywa się przez zastąpienie metody 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 niestandardowej kontrolki przy użyciu szablonów programu Visual Studio, metoda OnPaint
zostanie automatycznie przesłonięta. Szablon robi to, ponieważ musisz napisać kod w celu narysowania kontrolki. 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
Kontrolka niestandardowa jest malowana za pomocą metody OnPaint. Jednym argumentem PaintEventArgs tej metody jest obiekt, który zapewnia wszystkie informacje i funkcje wymagane do renderowania kontrolki.
PaintEventArgs
udostępnia dwie właściwości używane podczas renderowania kontrolki:
PaintEventArgs.ClipRectangle— reprezentuje część kontrolki, która musi zostać ponownie wyrysowana. Może to być cała kontrolka lub część kontrolki.
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
Poprzedni 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. Tło jest faktycznie malowane metodą OnPaintBackground(PaintEventArgs) zanim zostanie wywołana OnPaint
. Zastąpij OnPaintBackground
, aby obsłużyć rysowanie tła kontrolki. Domyślna implementacja tej metody polega na narysowaniu koloru i obrazu określonego odpowiednio przez właściwości BackColor i BackgroundImage.
Treści powiązane
.NET Desktop feedback