Sdílet prostřednictvím


Vytvoření jednoduchého vlastního ovládacího prvku

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ží OnTextChanged k zneplatnění ovládacího prvku.
  • Zadejte kód v OnPaint metodě 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.

  1. 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.

    Obrázek aplikace Visual Studio. V okně Průzkumníka řešení byl projekt kliknutím pravým tlačítkem myši zobrazen s nabídkou. V této nabídce je zvýrazněná položka nabídky 'Přidat', která je rozbalená s podnabídkou. V podnabídce je zvýrazněná položka 'Nová položka'.

  2. Vyhledejte vlastní ovládací prvek a vyberte ho.

  3. Nastavte název souboru na FirstControl a vyberte Přidat.

  4. 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:

  1. Přidejte pole s názvem _textAlignment typu HorizontalAlignment.

    private HorizontalAlignment _textAlignment = HorizontalAlignment.Left;
    
    Private _textAlignment As HorizontalAlignment = HorizontalAlignment.Left
    
  2. Zabalte pole do vlastnosti s názvem TextAlignment. Při nastavování vlastnosti zavolejte metodu Invalidate , 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 Property
    
  3. Př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:

  1. Překryjte metodu OnTextChanged.
  2. Zavolejte base.OnTextChanged, aby událost TextChanged byla vyvolána, jak očekávají uživatelé ovládacího prvku.
  3. Zavolejte metodu Invalidate pro 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:

  1. Vyhledejte metodu OnPaint vygenerovanou šablonou. Pokud něco chybí, přepište to ze základní třídy.

  2. Vytvořte novou StringFormat proměnnou s názvem style.

    StringFormat style = new();
    
    Dim style As New StringFormat
    

    Typ System.Drawing.StringFormat zapouzdřuje informace o rozložení textu a poskytuje přístup k zarovnání.

  3. Na základě TextAlignment nastavte vlastnost style.Alignment na 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 Select
    
  4. Nakreslete Text vlastnost 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 Using
    

    Důležité

    Metoda Graphics.DrawString používá Brush pro barvu textu. Brushes musí 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í.

  5. Zavolejte base.OnPaint, abyste zajistili, že událost Paint bude vyvolána.

    base.OnPaint(pe);
    
    MyBase.OnPaint(e)
    
  6. 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