Rozszerzanie istniejącej kontrolki
Jeśli chcesz dodać więcej funkcji do istniejącej kontrolki, możesz utworzyć kontrolkę dziedziczą z istniejącej kontrolki. Nowa kontrolka zawiera wszystkie możliwości i wizualny aspekt kontrolki podstawowej, ale daje możliwość jej rozszerzenia. Jeśli na przykład utworzono kontrolkę dziedziczą Button, nowa kontrolka będzie wyglądać i działać dokładnie tak jak przycisk. Możesz utworzyć nowe metody i właściwości, aby dostosować zachowanie kontrolki. Niektóre kontrolki umożliwiają zastąpienie metody w celu zmiany wyglądu OnPaint kontrolki.
Dodawanie kontrolki niestandardowej do projektu
Po utworzeniu nowego projektu użyj szablonów programu Visual Studio, aby utworzyć kontrolkę użytkownika. W poniższych krokach pokazano, jak dodać kontrolkę użytkownika do projektu:
W programie Visual Studio znajdź okienko Eksplorator projektów. Kliknij prawym przyciskiem myszy projekt i wybierz polecenie Dodaj>klasę.
W polu Nazwa wpisz nazwę kontrolki użytkownika. Program Visual Studio udostępnia domyślną i unikatową nazwę, której można użyć. Następnie naciśnij przycisk Dodaj.
Po utworzeniu kontrolki użytkownika program Visual Studio otwiera edytor kodu dla kontrolki. Następnym krokiem jest przekształcenie tej kontrolki niestandardowej w przycisk i rozszerzenie go.
Zmienianie kontrolki niestandardowej na przycisk
W tej sekcji dowiesz się, jak zmienić kontrolkę niestandardową na przycisk zliczany i wyświetlający liczbę kliknięć.
Po dodaniu kontrolki niestandardowej do projektu o nazwie CustomControl1
należy otworzyć projektanta kontrolek. Jeśli tak nie jest, kliknij dwukrotnie kontrolkę w Eksplorator rozwiązań. Wykonaj następujące kroki, aby przekonwertować kontrolkę niestandardową na kontrolkę dziedziczą i Button
rozszerza ją:
Po otwarciu projektanta kontrolek naciśnij F7 lub kliknij prawym przyciskiem myszy okno projektanta i wybierz polecenie Wyświetl kod.
W edytorze kodu powinna zostać wyświetlona definicja klasy:
namespace CustomControlProject { public partial class CustomControl2 : Control { public CustomControl2() { InitializeComponent(); } protected override void OnPaint(PaintEventArgs pe) { base.OnPaint(pe); } } }
Public Class CustomControl2 Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs) MyBase.OnPaint(e) 'Add your custom paint code here End Sub End Class
Zmień klasę bazową z
Control
naButton
.Ważne
Jeśli używasz języka Visual Basic, klasa bazowa jest zdefiniowana w pliku *.designer.vb kontrolki. Klasa bazowa do użycia w Visual Basic to
System.Windows.Forms.Button
.Dodaj zmienną o zakresie klasy o nazwie
_counter
.private int _counter = 0;
Private _counter As Integer = 0
Zastąpij metodę
OnPaint
. Ta metoda rysuje kontrolkę. Kontrolka powinna narysować ciąg na górze przycisku, więc najpierw należy wywołać metodę klasyOnPaint
bazowej, a następnie narysować ciąg.protected override void OnPaint(PaintEventArgs pe) { // Draw the control base.OnPaint(pe); // Paint our string on top of it pe.Graphics.DrawString($"Clicked {_counter} times", Font, Brushes.Purple, new PointF(3, 3)); }
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs) ' Draw the control MyBase.OnPaint(e) ' Paint our string on top of it e.Graphics.DrawString($"Clicked {_counter} times", Font, Brushes.Purple, New PointF(3, 3)) End Sub
Na koniec przesłoń metodę
OnClick
. Ta metoda jest wywoływana za każdym razem, gdy kontrolka jest naciśnięta. Kod zwiększy licznik, a następnie wywoła metodęInvalidate
, która wymusza ponowne rysowanie kontrolki.protected override void OnClick(EventArgs e) { // Increase the counter and redraw the control _counter++; Invalidate(); // Call the base method to invoke the Click event base.OnClick(e); }
Protected Overrides Sub OnClick(e As EventArgs) ' Increase the counter and redraw the control _counter += 1 Invalidate() ' Call the base method to invoke the Click event MyBase.OnClick(e) End Sub
Końcowy kod powinien wyglądać podobnie do następującego fragmentu kodu:
public partial class CustomControl1 : Button { private int _counter = 0; public CustomControl1() { InitializeComponent(); } protected override void OnPaint(PaintEventArgs pe) { // Draw the control base.OnPaint(pe); // Paint our string on top of it pe.Graphics.DrawString($"Clicked {_counter} times", Font, Brushes.Purple, new PointF(3, 3)); } protected override void OnClick(EventArgs e) { // Increase the counter and redraw the control _counter++; Invalidate(); // Call the base method to invoke the Click event base.OnClick(e); } }
Public Class CustomControl1 Private _counter As Integer = 0 Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs) ' Draw the control MyBase.OnPaint(e) ' Paint our string on top of it e.Graphics.DrawString($"Clicked {_counter} times", Font, Brushes.Purple, New PointF(3, 3)) End Sub Protected Overrides Sub OnClick(e As EventArgs) ' Increase the counter and redraw the control _counter += 1 Invalidate() ' Call the base method to invoke the Click event MyBase.OnClick(e) End Sub End Class
Po utworzeniu kontrolki skompiluj projekt, aby wypełnić okno Przybornik nową kontrolką. Otwórz projektanta formularzy i przeciągnij kontrolkę do formularza. Uruchom projekt i naciśnij przycisk . Każde naciśnięcie zwiększa liczbę kliknięć po jednym. Łączne kliknięcia są drukowane jako tekst w górnej części przycisku.
.NET Desktop feedback