Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym artykule przedstawiono sposób tworzenia niestandardowej kontrolki formularzy systemu Windows. Prosta kontrolka opracowana w tym artykule wyświetla kontrolkę Text po lewej stronie, w środku lub po prawej stronie kontrolki. Można zmienić wyrównanie tekstu. Ta kontrolka nie zgłasza ani nie obsługuje zdarzeń.
W tym artykule omówiono sposób wykonywania następujących zadań:
- Dodaj właściwość i pole, aby obsłużyć ustawienie poziomego wyrównania tekstu.
- Użyj
OnTextChangedpolecenia , aby unieważnić kontrolkę. - Podaj kod w metodzie
OnPaint, aby narysować tekst na powierzchni kontrolki.
Dodawanie kontrolki niestandardowej
Pierwszym krokiem jest dodanie niestandardowej kontrolki do projektu.
W programie Visual Studio znajdź okno Eksplorator rozwiązań . Kliknij prawym przyciskiem myszy projekt i wybierz polecenie Dodaj>nowy element.
Wyszukaj kontrolkę niestandardową i wybierz ją.
Ustaw nazwę pliku na FirstControl i wybierz pozycję Dodaj.
Jeśli tryb projektowania kontrolki jest widoczny, przejdź do widoku kodu. Naciśnij F7 lub wybierz link przełączenia do widoku kodu .
Wskazówka
Możesz również kliknąć prawym przyciskiem myszy plik w oknie Eksplorator rozwiązań i wybrać polecenie Wyświetl kod.
Teraz należy przyjrzeć się kodowi źródłowemu dla kontrolki niestandardowej, która wygląda podobnie do poniższego fragmentu kodu:
public partial class FirstControl : Control
{
public FirstControl()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
}
}
Public Class FirstControl
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
'Add your custom paint code here
End Sub
End Class
Dodawanie właściwości
Utwórz nową właściwość kontrolki o nazwie TextAlignment. Ta właściwość dostosuje miejsce malowania tekstu na kontrolce.
FirstControl W klasie wykonaj następujące kroki:
Dodaj pole o nazwie
_textAlignmenttypuHorizontalAlignment.private HorizontalAlignment _textAlignment = HorizontalAlignment.Left;Private _textAlignment As HorizontalAlignment = HorizontalAlignment.LeftOwiń pole we właściwości o nazwie
TextAlignment. Podczas ustawiania właściwości wywołaj metodęInvalidate, aby wymusić przemalowanie kontrolki.public HorizontalAlignment TextAlignment { get => _textAlignment; set { _textAlignment = value; Invalidate(); } }Public Property TextAlignment As HorizontalAlignment Get Return _textAlignment End Get Set(value As HorizontalAlignment) _textAlignment = value Invalidate() End Set End PropertyDodaj następujące atrybuty do właściwości, aby zintegrować ją z oknem Właściwości w programie Visual Studio.
Category— kategoria zastosowana do właściwości .Description— opis właściwości.DefaultValue— wartość domyślna właściwości.Wartość domyślna umożliwia zresetowanie właściwości przez projektanta. Pomaga również określić, kiedy właściwość powinna być serializowana w kodzie, ponieważ wartości domyślne nie są serializowane.
[System.ComponentModel.Category("Alignment"), System.ComponentModel.Description("Specifies the alignment of text."), System.ComponentModel.DefaultValue(HorizontalAlignment.Left)] public HorizontalAlignment TextAlignment<System.ComponentModel.Category("Alignment"), System.ComponentModel.Description("Specifies the alignment of text."), System.ComponentModel.DefaultValue(HorizontalAlignment.Left)> Public Property TextAlignment As HorizontalAlignment
Obsługa zmienionego tekstu
Właściwość TextAlignment wywołuje Invalidate, aby kontrolka sama się przerysowywała. Dzięki temu poprawne wyrównanie jest natychmiast używane podczas renderowania Text kontrolki. Jednak jeśli właściwość Text ulegnie zmianie, nic nie zostanie zaktualizowane, ponieważ Text nie wywołuje Invalidate. Właściwość wprawdzie wywołuje metodę OnTextChanged, którą można przesłonić, aby za pomocą wywołania Invalidate wymusić, by kontrolka sama się przemalowała.
FirstControl W klasie wykonaj następujące kroki:
- Zastąp metodę
OnTextChanged. - Wywołaj
base.OnTextChanged, aby zdarzenieTextChangedzostało zgłoszone zgodnie z oczekiwaniami odbiorców kontrolki. - Wywołaj metodę ,
Invalidateaby wymusić przemalowanie.
Kod powinien wyglądać podobnie do następującego fragmentu kodu:
protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e);
Invalidate();
}
Protected Overrides Sub OnTextChanged(e As EventArgs)
MyBase.OnTextChanged(e)
Invalidate()
End Sub
Malowanie kontrolki
Ostatnią częścią kontrolki niestandardowej jest malowanie.
FirstControl W klasie wykonaj następujące kroki:
Znajdź metodę
OnPaintwygenerowaną przez szablon. Jeśli go brakuje, przesłoń go z klasy bazowej.Utwórz nową
StringFormatzmienną o nazwiestyle.StringFormat style = new();Dim style As New StringFormatTyp System.Drawing.StringFormat hermetyzuje informacje o układzie tekstowym i zapewnia dostęp do wyrównania.
TextAlignmentNa podstawie parametrustyle.Alignmentustaw właściwość na odpowiednią wartość.style.Alignment = TextAlignment switch { // Map the HorizontalAlignment enum to the StringAlignment enum HorizontalAlignment.Left => StringAlignment.Near, HorizontalAlignment.Right => StringAlignment.Far, HorizontalAlignment.Center => StringAlignment.Center, // Default to Near alignment _ => StringAlignment.Near };'Map the HorizontalAlignment enum to the StringAlignment enum Select Case TextAlignment Case HorizontalAlignment.Left style.Alignment = StringAlignment.Near Case HorizontalAlignment.Right style.Alignment = StringAlignment.Far Case HorizontalAlignment.Center style.Alignment = StringAlignment.Center End SelectNarysuj właściwość
Textza pomocąGraphics.DrawStringpolecenia.// Create the brush and automatically dispose it. using SolidBrush foreBrush = new(ForeColor); // Call the DrawString method to write text. // Text, Font, and ClientRectangle are inherited properties. pe.Graphics.DrawString(Text, Font, foreBrush, ClientRectangle, style);'Create the brush and automatically dispose it. Using foreBrush As New SolidBrush(ForeColor) 'Call the DrawString method to write text. 'Text, Font, and ClientRectangle are inherited properties. e.Graphics.DrawString(Text, Font, foreBrush, ClientRectangle, style) End UsingWażne
Metoda
Graphics.DrawStringużywaBrushdo koloru tekstu.Brushesnależy usunąć po użyciu.Metoda Graphics.DrawString używa tekstu, czcionki, koloru i opcji formatowania, aby narysować ciąg.
Wywołaj
base.OnPaint, aby upewnić się, że zdarzeniePaintjest zgłaszane.base.OnPaint(pe);MyBase.OnPaint(e)Zapisz plik kodu i skompiluj projekt. Po skompilowaniu projektu program Visual Studio dodaje kontrolkę niestandardową do okna Przybornik po otwarciu projektanta wizualnego.
Kod powinien wyglądać podobnie do następującego fragmentu kodu:
public partial class FirstControl : Control
{
private HorizontalAlignment _textAlignment = HorizontalAlignment.Left;
[System.ComponentModel.Category("Alignment"),
System.ComponentModel.Description("Specifies the alignment of text."),
System.ComponentModel.DefaultValue(HorizontalAlignment.Left)]
public HorizontalAlignment TextAlignment
{
get => _textAlignment;
set
{
_textAlignment = value;
Invalidate();
}
}
public FirstControl()
{
InitializeComponent();
}
protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e);
Invalidate();
}
protected override void OnPaint(PaintEventArgs pe)
{
StringFormat style = new();
style.Alignment = TextAlignment switch
{
// Map the HorizontalAlignment enum to the StringAlignment enum
HorizontalAlignment.Left => StringAlignment.Near,
HorizontalAlignment.Right => StringAlignment.Far,
HorizontalAlignment.Center => StringAlignment.Center,
// Default to Near alignment
_ => StringAlignment.Near
};
// Create the brush and automatically dispose it.
using SolidBrush foreBrush = new(ForeColor);
// Call the DrawString method to write text.
// Text, Font, and ClientRectangle are inherited properties.
pe.Graphics.DrawString(Text, Font, foreBrush, ClientRectangle, style);
base.OnPaint(pe);
}
}
Public Class FirstControl
Private _textAlignment As HorizontalAlignment = HorizontalAlignment.Left
<System.ComponentModel.Category("Alignment"),
System.ComponentModel.Description("Specifies the alignment of text."),
System.ComponentModel.DefaultValue(HorizontalAlignment.Left)>
Public Property TextAlignment As HorizontalAlignment
Get
Return _textAlignment
End Get
Set(value As HorizontalAlignment)
_textAlignment = value
Invalidate()
End Set
End Property
Protected Overrides Sub OnTextChanged(e As EventArgs)
MyBase.OnTextChanged(e)
Invalidate()
End Sub
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
Dim style As New StringFormat
'Map the HorizontalAlignment enum to the StringAlignment enum
Select Case TextAlignment
Case HorizontalAlignment.Left
style.Alignment = StringAlignment.Near
Case HorizontalAlignment.Right
style.Alignment = StringAlignment.Far
Case HorizontalAlignment.Center
style.Alignment = StringAlignment.Center
End Select
'Create the brush and automatically dispose it.
Using foreBrush As New SolidBrush(ForeColor)
'Call the DrawString method to write text.
'Text, Font, and ClientRectangle are inherited properties.
e.Graphics.DrawString(Text, Font, foreBrush, ClientRectangle, style)
End Using
MyBase.OnPaint(e)
End Sub
End Class
Treści powiązane
.NET Desktop feedback