Condividi tramite


Creare un semplice controllo personalizzato

Questo articolo illustra come creare un controllo Windows Form personalizzato. Il controllo semplice sviluppato in questo articolo stampa il controllo Text a sinistra, al centro o a destra del controllo. È possibile modificare l'allineamento del testo. Questo controllo non genera o gestisce eventi.

In questo articolo viene spiegato come:

  • Aggiungere una proprietà e un campo per gestire l'impostazione di allineamento orizzontale del testo.
  • Utilizzare OnTextChanged per invalidare il controllo.
  • Fornire codice nel metodo OnPaint per disegnare testo sulla superficie del controllo.

Aggiungere un controllo personalizzato

Il primo passaggio consiste nell'aggiungere un controllo personalizzato al progetto.

  1. In Visual Studio trovare la finestra Esplora soluzioni . Fare clic con il pulsante destro del mouse sul progetto e scegliere Aggiungi>nuovo elemento.

    Immagine di Visual Studio. Nella finestra Esplora soluzioni è stato fatto clic con il pulsante destro del mouse sul progetto che mostra un menu. Evidenziato nel menu è la voce di menu

  2. Cercare Controllo personalizzato e selezionarlo.

  3. Impostare il nome del file su FirstControl e selezionare Aggiungi.

  4. Se la modalità progettazione del controllo è visibile, passare alla visualizzazione codice. Premere F7 o selezionare il collegamento passa alla visualizzazione codice .

    Suggerimento

    È anche possibile fare clic con il pulsante destro del mouse sul file nella finestra Esplora soluzioni e scegliere Visualizza codice.

A questo punto si dovrebbe esaminare il codice sorgente per il controllo personalizzato, simile al frammento di codice seguente:

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

Aggiungere una proprietà

Creare una nuova proprietà nel controllo denominato TextAlignment. Questa proprietà regola la posizione in cui viene disegnato il testo nel controllo . Con la FirstControl classe seguire questa procedura:

  1. Aggiungere un campo denominato _textAlignment del tipo HorizontalAlignment.

    private HorizontalAlignment _textAlignment = HorizontalAlignment.Left;
    
    Private _textAlignment As HorizontalAlignment = HorizontalAlignment.Left
    
  2. Avvolgere il campo in una proprietà denominata TextAlignment. Quando si imposta la proprietà, chiamare il Invalidate metodo per forzare il controllo a ridisegnarsi.

    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. Aggiungere gli attributi seguenti alla proprietà per integrarlo con la finestra Proprietà in Visual Studio.

    • Category— Categoria applicata alla proprietà .

    • Description— Descrizione della proprietà.

    • DefaultValue: valore predefinito per la proprietà .

      Il valore predefinito consente di reimpostare la proprietà dalla finestra di progettazione. Consente inoltre di determinare quando la proprietà deve essere serializzata nel code-behind, perché i valori predefiniti non vengono serializzati.

    [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
    

Gestire il testo modificato

La TextAlignment proprietà chiama Invalidate in modo che il controllo ridisegni se stesso. In questo modo si garantisce che l'allineamento corretto venga usato immediatamente nel Text del rendering del controllo. Tuttavia, se la Text proprietà viene modificata, non viene aggiornato alcun elemento perché Text non chiama Invalidate. La proprietà, tuttavia, chiama il metodo OnTextChanged, che è possibile sovrascrivere per chiamare Invalidate e forzare il controllo a ridisegnarsi.

Con la FirstControl classe seguire questa procedura:

  1. Sovrascrivere il metodo OnTextChanged.
  2. Chiamare base.OnTextChanged affinché l'evento TextChanged venga generato come previsto dagli utenti del controllo.
  3. Chiamare il metodo Invalidate per forzare il ridisegno.

Il codice dovrebbe essere simile al frammento di codice seguente:

protected override void OnTextChanged(EventArgs e)
{
    base.OnTextChanged(e);
    Invalidate();
}
Protected Overrides Sub OnTextChanged(e As EventArgs)
    MyBase.OnTextChanged(e)
    Invalidate()
End Sub

Disegnare il controllo

L'ultima parte del controllo personalizzato è disegnata. Con la FirstControl classe seguire questa procedura:

  1. Individuare il OnPaint metodo generato dal modello. Se manca, effettuare l'override dalla classe base.

  2. Creare una nuova StringFormat variabile denominata style.

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

    Il System.Drawing.StringFormat tipo incapsula le informazioni sul layout del testo e fornisce l'accesso all'allineamento.

  3. In base a TextAlignment, impostare la style.Alignment proprietà sul valore appropriato.

    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. Disegna la proprietà Text con 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
    

    Importante

    Il Graphics.DrawString metodo utilizza un oggetto Brush per il colore del testo. Brushes deve essere eliminato dopo l'utilizzo.

    Il Graphics.DrawString metodo usa testo, un tipo di carattere, un colore e opzioni di formattazione per disegnare una stringa.

  5. Chiamare base.OnPaint per assicurarsi che l'evento Paint venga generato.

    base.OnPaint(pe);
    
    MyBase.OnPaint(e)
    
  6. Salvare il file di codice e compilare il progetto. Dopo la compilazione del progetto, Visual Studio aggiunge il controllo personalizzato alla finestra casella degli strumenti quando si apre Progettazione oggetti visivi.

Il codice dovrebbe essere simile al frammento di codice seguente:

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