Share via


Procedura: sviluppare un controllo di Windows Form semplice

Aggiornamento: novembre 2007

In questa sezione vengono illustrati i passaggi chiave necessari per la creazione di un controllo di Windows Form personalizzato. Il controllo semplice sviluppato in questa procedura dettagliata consente di modificare l'allineamento della relativa proprietà Text. Non genera né gestisce alcun evento.

Per creare un controllo semplice personalizzato

  1. Definire una classe che deriva da System.Windows.Forms.Control.

    Public Class FirstControl
       Inherits Control
    
    End Class
    
    public class FirstControl:Control{}
    
  2. Definire delle proprietà. La definizione di proprietà non è obbligatoria, in quanto i controlli ereditano numerose proprietà dalla classe Control, ma per la maggior parte dei controlli personalizzati vengono in genere definite proprietà aggiuntive. Nel frammento di codice riportato di seguito viene definita una proprietà denominata TextAlignment utilizzata da FirstControl per impostare il formato di visualizzazione della proprietà Text ereditata da Control. Per ulteriori informazioni sulla definizione delle proprietà, vedere Cenni preliminari sulle proprietà.

    ' ContentAlignment is an enumeration defined in the System.Drawing
    ' namespace that specifies the alignment of content on a drawing 
    ' surface.
    Private alignmentValue As ContentAlignment = ContentAlignment.MiddleLeft
    
    <Category("Alignment"), Description("Specifies the alignment of text.")> _
    Public Property TextAlignment() As ContentAlignment
    
       Get
          Return alignmentValue
       End Get
       Set
          alignmentValue = value
    
          ' The Invalidate method invokes the OnPaint method described 
          ' in step 3.
          Invalidate()
       End Set
    End Property
    
    // ContentAlignment is an enumeration defined in the System.Drawing
    // namespace that specifies the alignment of content on a drawing 
    // surface.
    private ContentAlignment alignmentValue = ContentAlignment.MiddleLeft;
    

    Quando si imposta una proprietà che modifica la visualizzazione del controllo, è necessario chiamare il metodo Invalidate per ridisegnare il controllo. Invalidate è definito nella classe Control base.

  3. Eseguire l'override del metodo OnPaint protetto ereditato da Control per fornire la logica di rendering al controllo. Se non si sottopone a override OnPaint, non sarà possibile disegnare il controllo. Nel frammento di codice riportato di seguito il metodo OnPaint visualizza la proprietà Text ereditata da Control con l'allineamento specificato nel campo alignmentValue.

    Protected Overrides Sub OnPaint(e As PaintEventArgs)
    
       MyBase.OnPaint(e)
       Dim style As New StringFormat()
       style.Alignment = StringAlignment.Near
       Select Case alignmentValue
          Case ContentAlignment.MiddleLeft
             style.Alignment = StringAlignment.Near
          Case ContentAlignment.MiddleRight
             style.Alignment = StringAlignment.Far
          Case ContentAlignment.MiddleCenter
             style.Alignment = StringAlignment.Center
       End Select
    
       ' Call the DrawString method of the System.Drawing class to write   
       ' text. Text and ClientRectangle are properties inherited from
       ' Control.
       e.Graphics.DrawString( _
           me.Text, _
           me.Font, _
           New SolidBrush(ForeColor), _
           RectangleF.op_Implicit(ClientRectangle), _
           style)
    
    End Sub
    
    protected override void OnPaint(PaintEventArgs e) 
    {   
        base.OnPaint(e);
        StringFormat style = new StringFormat();
        style.Alignment = StringAlignment.Near;
        switch (alignmentValue) 
        {
            case ContentAlignment.MiddleLeft:
                style.Alignment = StringAlignment.Near;
                break;
            case ContentAlignment.MiddleRight:
                style.Alignment = StringAlignment.Far;
                break;
            case ContentAlignment.MiddleCenter:
                style.Alignment = StringAlignment.Center;
                break;
        }
    
        // Call the DrawString method of the System.Drawing class to write   
        // text. Text and ClientRectangle are properties inherited from
        // Control.
        e.Graphics.DrawString(
            Text, 
            Font, 
            new SolidBrush(ForeColor), 
            ClientRectangle, style);
    
    } 
    
  4. Specificare attributi per il controllo. Gli attributi consentono, in fase di progettazione, la corretta visualizzazione del controllo e delle proprietà e degli eventi a esso associati nelle finestre di progettazione visive. Nel codice riportato di seguito vengono applicati attributi alla proprietà TextAlignment. In una finestra di progettazione quale quella di Visual Studio l'attributo Category (riportato nel frammento di codice) determina la visualizzazione della proprietà in una categoria logica. L'attributo Description determina inoltre la visualizzazione di una stringa descrittiva nella parte inferiore della finestra Proprietà quando viene selezionata la proprietà TextAlignment. Per ulteriori informazioni sugli attributi, vedere Attributi per componenti in fase di progettazione.

    <Category("Alignment"), Description("Specifies the alignment of text.")> _
    Public Property TextAlignment() As ContentAlignment
    
    [
    Category("Alignment"),
    Description("Specifies the alignment of text.")
    ]
    
  5. (facoltativo) Specificare risorse per il controllo. È possibile fornire una risorsa, quale un'immagine bitmap, per il controllo mediante un'opzione di compilazione (/res per C#) che consente di associare risorse al controllo. In fase di esecuzione è possibile recuperare la risorsa utilizzando i metodi della classe ResourceManager. Per ulteriori informazioni sulla creazione e sull'utilizzo delle risorse, vedere Risorse nelle applicazioni.

  6. Compilare e distribuire il controllo. Per compilare e distribuire FirstControl, eseguire i seguenti passaggi:

    1. Salvare il codice dell'esempio che segue in un file di origine, quale FirstControl.cs o FirstControl.vb.

    2. Compilare il codice sorgente in un assembly e salvarlo nella directory dell'applicazione. A tal scopo eseguire il seguente comando dalla directory contenente il file di origine.

      vbc /t:library /out:[path to your application's directory]/CustomWinControls.dll /r:System.dll /r:System.Windows.Forms.dll /r:System.Drawing.dll FirstControl.vb
      
      csc /t:library /out:[path to your application's directory]/CustomWinControls.dll /r:System.dll /r:System.Windows.Forms.dll /r:System.Drawing.dll FirstControl.cs
      

      L'opzione di compilazione /t:library informa il compilatore che l'assembly creato è una libreria e non un eseguibile. L'opzione /out specifica il percorso e il nome dell'assembly. L'opzione /r fornisce il nome degli assembly ai quali il codice fa riferimento. In questo esempio verrà creato un assembly privato utilizzabile solo dalle proprie applicazioni. Sarà pertanto necessario salvarlo nella directory dell'applicazione. Per ulteriori informazioni sulla creazione del package e sulla distribuzione di un controllo, vedere Distribuzione di applicazioni .NET Framework.

Nell'esempio che segue è riportato il codice di FirstControl. Il controllo è racchiuso nello spazio dei nomi CustomWinControls. Gli spazi dei nomi forniscono un raggruppamento logico di tipi correlati. È possibile creare il controllo in un nuovo spazio dei nomi o in uno spazio dei nomi esistente. In C# la dichiarazione using (Imports in Visual Basic) consente di accedere ai tipi da uno spazio dei nomi senza utilizzare il nome completo dei tipi. Nell'esempio riportato di seguito la dichiarazione using consente al codice di accedere alla classe Control da System.Windows.Forms semplicemente come Control anziché dovendo utilizzare il nome completo System.Windows.Forms.Control.

Imports System
Imports System.Drawing
Imports System.Collections
Imports System.ComponentModel
Imports System.Windows.Forms


Public Class FirstControl
   Inherits Control

   Public Sub New()
   End Sub 


   ' ContentAlignment is an enumeration defined in the System.Drawing
   ' namespace that specifies the alignment of content on a drawing 
   ' surface.
   Private alignmentValue As ContentAlignment = ContentAlignment.MiddleLeft

   <Category("Alignment"), Description("Specifies the alignment of text.")> _
   Public Property TextAlignment() As ContentAlignment

      Get
         Return alignmentValue
      End Get
      Set
         alignmentValue = value

         ' The Invalidate method invokes the OnPaint method described 
         ' in step 3.
         Invalidate()
      End Set
   End Property


   Protected Overrides Sub OnPaint(e As PaintEventArgs)

      MyBase.OnPaint(e)
      Dim style As New StringFormat()
      style.Alignment = StringAlignment.Near
      Select Case alignmentValue
         Case ContentAlignment.MiddleLeft
            style.Alignment = StringAlignment.Near
         Case ContentAlignment.MiddleRight
            style.Alignment = StringAlignment.Far
         Case ContentAlignment.MiddleCenter
            style.Alignment = StringAlignment.Center
      End Select

      ' Call the DrawString method of the System.Drawing class to write   
      ' text. Text and ClientRectangle are properties inherited from
      ' Control.
      e.Graphics.DrawString( _
          me.Text, _
          me.Font, _
          New SolidBrush(ForeColor), _
          RectangleF.op_Implicit(ClientRectangle), _
          style)

   End Sub

End Class
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace CustomWinControls
{
    public class FirstControl : Control
    {

        public FirstControl()
        {

        }

        // ContentAlignment is an enumeration defined in the System.Drawing
        // namespace that specifies the alignment of content on a drawing 
        // surface.
        private ContentAlignment alignmentValue = ContentAlignment.MiddleLeft;

        [
        Category("Alignment"),
        Description("Specifies the alignment of text.")
        ]
        public ContentAlignment TextAlignment 
        {

            get 
            {
                return alignmentValue;
            }
            set 
            {
                alignmentValue = value;

                // The Invalidate method invokes the OnPaint method described 
                // in step 3.
                Invalidate(); 
            }
        }


        protected override void OnPaint(PaintEventArgs e) 
        {   
            base.OnPaint(e);
            StringFormat style = new StringFormat();
            style.Alignment = StringAlignment.Near;
            switch (alignmentValue) 
            {
                case ContentAlignment.MiddleLeft:
                    style.Alignment = StringAlignment.Near;
                    break;
                case ContentAlignment.MiddleRight:
                    style.Alignment = StringAlignment.Far;
                    break;
                case ContentAlignment.MiddleCenter:
                    style.Alignment = StringAlignment.Center;
                    break;
            }

            // Call the DrawString method of the System.Drawing class to write   
            // text. Text and ClientRectangle are properties inherited from
            // Control.
            e.Graphics.DrawString(
                Text, 
                Font, 
                new SolidBrush(ForeColor), 
                ClientRectangle, style);

        } 
    }
}

Utilizzo del controllo personalizzato in un form

Nell'esempio che segue viene illustrato un form semplice che utilizza FirstControl. Tale esempio consentirà di creare tre istanze di FirstControl, ciascuna con un valore differente per la proprietà TextAlignment.

Per compilare ed eseguire l'esempio

  1. Salvare il codice dell'esempio riportato di seguito in un file di origine, quale SimpleForm.cs o SimpleForms.vb.

  2. Compilare il codice sorgente in un assembly eseguibile utilizzando il seguente comando dalla directory contenente il file di origine.

    vbc /r:CustomWinControls.dll /r:System.dll /r:System.Windows.Forms.dll /r:System.Drawing.dll SimpleForm.vb
    
    csc /r:CustomWinControls.dll /r:System.dll /r:System.Windows.Forms.dll /r:System.Drawing.dll SimpleForm.cs
    

    CustomWinControls.dll è l'assembly che contiene la classe FirstControl. È necessario che questo assembly si trovi nella stessa directory del file di origine del form che vi accede (SimpleForm.cs o SimpleForms.vb).

  3. Eseguire SimpleForm.exe utilizzando il seguente comando.

    SimpleForm
    
Imports System
Imports System.Drawing
Imports System.Collections
Imports System.ComponentModel
Imports System.Windows.Forms




Public Class SimpleForm
   Inherits System.Windows.Forms.Form

   Private firstControl1 As FirstControl

   Private components As System.ComponentModel.Container = Nothing


   Public Sub New()
      InitializeComponent()
   End Sub 





   Private Sub InitializeComponent()
      Me.firstControl1 = New FirstControl()
      Me.SuspendLayout()

      ' 
      ' firstControl1
      ' 
      Me.firstControl1.BackColor = System.Drawing.SystemColors.ControlDark
      Me.firstControl1.Location = New System.Drawing.Point(96, 104)
      Me.firstControl1.Name = "firstControl1"
      Me.firstControl1.Size = New System.Drawing.Size(75, 16)
      Me.firstControl1.TabIndex = 0
      Me.firstControl1.Text = "Hello World"
      Me.firstControl1.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter

      ' 
      ' SimpleForm
      ' 
      Me.ClientSize = New System.Drawing.Size(292, 266)
      Me.Controls.Add(firstControl1)
      Me.Name = "SimpleForm"
      Me.Text = "SimpleForm"
      Me.ResumeLayout(False)
   End Sub 


   <STAThread()>  _
   Shared Sub Main()
      Application.Run(New SimpleForm())
   End Sub 
End Class 
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace CustomWinControls
{

    public class SimpleForm : System.Windows.Forms.Form
    {
        private FirstControl firstControl1;

        private System.ComponentModel.Container components = null;

        public SimpleForm()
        {
            InitializeComponent();
        }

        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null) 
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        private void InitializeComponent()
        {
            this.firstControl1 = new FirstControl();
            this.SuspendLayout();

            // 
            // firstControl1
            // 
            this.firstControl1.BackColor = System.Drawing.SystemColors.ControlDark;
            this.firstControl1.Location = new System.Drawing.Point(96, 104);
            this.firstControl1.Name = "firstControl1";
            this.firstControl1.Size = new System.Drawing.Size(75, 16);
            this.firstControl1.TabIndex = 0;
            this.firstControl1.Text = "Hello World";
            this.firstControl1.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter;

            // 
            // SimpleForm
            // 
            this.ClientSize = new System.Drawing.Size(292, 266);
            this.Controls.Add(this.firstControl1);
            this.Name = "SimpleForm";
            this.Text = "SimpleForm";
            this.ResumeLayout(false);

        }

        [STAThread]
        static void Main() 
        {
            Application.Run(new SimpleForm());
        }


    }
}

Vedere anche

Concetti

Eventi nei controlli di Windows Form

Altre risorse

Proprietà dei controlli Windows Form