Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
V tomto článku se dozvíte, jak vytvořit vlastní ovládací prvek Windows Forms. Jednoduchý ovládací prvek vyvinutý v tomto článku vytiskne ovládací prvek Text vlevo, uprostřed nebo vpravo od ovládacího prvku. Zarovnání textu lze změnit. Tento ovládací prvek nevyvolá ani nezpracuje události.
V tomto článku získáte informace o těchto tématech:
- Přidejte vlastnost a pole pro zpracování nastavení vodorovného zarovnání textu.
- Slouží
OnTextChangedk zneplatnění ovládacího prvku. - Zadejte kód v
OnPaintmetodě pro kreslení textu na povrchu ovládacího prvku.
Přidání vlastního ovládacího prvku
Prvním krokem je přidání vlastního ovládacího prvku do projektu.
V sadě Visual Studio vyhledejte okno Průzkumníka řešení . Klikněte pravým tlačítkem myši na projekt a zvolte Přidat>novou položku.
Vyhledejte vlastní ovládací prvek a vyberte ho.
Nastavte název souboru na FirstControl a vyberte Přidat.
Pokud je režim návrhu ovládacího prvku viditelný, přepněte do zobrazení kódu. Stiskněte klávesu F7 nebo vyberte přepínač na odkaz pro zobrazení kódu .
Návod
Můžete také kliknout pravým tlačítkem myši na soubor v okně Průzkumníka řešení a vybrat Zobrazit kód.
Teď byste se měli podívat na zdrojový kód vlastního ovládacího prvku, který vypadá podobně jako následující fragment kódu:
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
Přidání vlastnosti
Vytvořte novou vlastnost ovládacího prvku s názvem TextAlignment. Tato vlastnost upraví, kde je text nakreslován na ovládacím prvku. Proveďte následující kroky se třídou FirstControl:
Přidejte pole s názvem
_textAlignmenttypuHorizontalAlignment.private HorizontalAlignment _textAlignment = HorizontalAlignment.Left;Private _textAlignment As HorizontalAlignment = HorizontalAlignment.LeftZabalte pole do vlastnosti s názvem
TextAlignment. Při nastavování vlastnosti zavolejte metoduInvalidate, která vynutí ovládací prvek překreslit sám sebe.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 PropertyPřidejte do vlastnosti následující atributy, které ho integrují s oknem Vlastnosti v sadě Visual Studio.
Category— Kategorie použitá na vlastnost.Description— Popis vlastnosti.DefaultValue– Výchozí hodnota vlastnosti.Výchozí hodnota umožňuje, aby se vlastnost resetuje návrhářem. Pomáhá také určit, kdy má být vlastnost serializována do kódu na pozadí, protože výchozí hodnoty nejsou serializovány.
[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
Zpracování změny textu
Vlastnost TextAlignment volá Invalidate , aby se ovládací prvek překreslil sám. Tím zajistíte, že se při vykreslování Text ovládacího prvku okamžitě použije správné zarovnání. Pokud se Text však vlastnost změní, nic se neaktualizuje, protože Text nevolá Invalidate. Vlastnost volá metodu OnTextChanged, kterou můžete přepsat, aby zavolala Invalidate a vynutila ovládací prvek, aby se překreslil.
Proveďte následující kroky se třídou FirstControl:
- Překryjte metodu
OnTextChanged. - Zavolejte
base.OnTextChanged, aby událostTextChangedbyla vyvolána, jak očekávají uživatelé ovládacího prvku. - Zavolejte metodu
Invalidatepro vynucení překreslení.
Váš kód by měl vypadat jako následující fragment kódu:
protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e);
Invalidate();
}
Protected Overrides Sub OnTextChanged(e As EventArgs)
MyBase.OnTextChanged(e)
Invalidate()
End Sub
Malování ovládacího prvku
Poslední část vlastního ovládacího prvku je malování. Proveďte následující kroky se třídou FirstControl:
Vyhledejte metodu
OnPaintvygenerovanou šablonou. Pokud něco chybí, přepište to ze základní třídy.Vytvořte novou
StringFormatproměnnou s názvemstyle.StringFormat style = new();Dim style As New StringFormatTyp System.Drawing.StringFormat zapouzdřuje informace o rozložení textu a poskytuje přístup k zarovnání.
Na základě
TextAlignmentnastavte vlastnoststyle.Alignmentna odpovídající hodnotu.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 SelectNakreslete
Textvlastnost pomocíGraphics.DrawString.// 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 UsingDůležité
Metoda
Graphics.DrawStringpoužíváBrushpro barvu textu.Brushesmusí být odstraněna po použití.Metoda Graphics.DrawString používá k nakreslení řetězce text, písmo, barvu a možnosti formátování.
Zavolejte
base.OnPaint, abyste zajistili, že událostPaintbude vyvolána.base.OnPaint(pe);MyBase.OnPaint(e)Uložte soubor kódu a zkompilujte projekt. Jakmile se projekt zkompiluje, Visual Studio přidá vlastní ovládací prvek do okna Panel nástrojů při otevření vizuálního návrháře.
Váš kód by měl vypadat jako následující fragment kódu:
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
Související obsah
.NET Desktop feedback