Procedura: sviluppare un controllo di Windows Form sempliceHow to: Develop a Simple Windows Forms Control

Questa sezione illustra i passaggi chiave per la creazione di un controllo di Windows Form personalizzato.This section walks you through the key steps for authoring a custom Windows Forms control. Il controllo semplice sviluppato in questa procedura dettagliata consente l'allineamento della relativa Text proprietà da modificare.The simple control developed in this walkthrough allows the alignment of its Text property to be changed. Non genera o gestisce eventi.It does not raise or handle events.

Per creare un controllo personalizzato sempliceTo create a simple custom control

  1. Definire una classe che deriva da System.Windows.Forms.Control.Define a class that derives from System.Windows.Forms.Control.

    Public Class FirstControl  
       Inherits Control  
    
    End Class  
    
    public class FirstControl:Control{}  
    
  2. Definire le proprietà.Define properties. (Non è necessario per definire le proprietà, poiché un controllo eredita le proprietà molti la Control classe, ma la maggior parte dei controlli personalizzati in genere definite proprietà aggiuntive.) Frammento di codice seguente definisce una proprietà denominata TextAlignment che FirstControl viene utilizzata per formattare la visualizzazione del Text proprietà ereditata da Control.(You are not required to define properties, because a control inherits many properties from the Control class, but most custom controls generally do define additional properties.) The following code fragment defines a property named TextAlignment that FirstControl uses to format the display of the Text property inherited from Control. Per altre informazioni sulla definizione delle proprietà, vedere Panoramica delle proprietà.For more information about defining properties, see Properties Overview.

    // 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;
    
    ' 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
    

    Quando si imposta una proprietà che modifica la visualizzazione del controllo, è necessario richiamare il Invalidate metodo per ridisegnare il controllo.When you set a property that changes the visual display of the control, you must invoke the Invalidate method to redraw the control. Invalidate è definito nella classe base Control.Invalidate is defined in the base class Control.

  3. Eseguire l'override protetto OnPaint metodo ereditato da Control per fornire la logica di rendering del controllo.Override the protected OnPaint method inherited from Control to provide rendering logic to your control. Se esegue l'override OnPaint, il controllo non sarà in grado di disegno.If you do not override OnPaint, your control will not be able to draw itself. Nel frammento di codice seguente, il OnPaint metodo visualizza il Text proprietà ereditata da Control con l'allineamento specificato il alignmentValue campo.In the following code fragment, the OnPaint method displays the Text property inherited from Control with the alignment specified by the alignmentValue field.

    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);
    
    } 
    
    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
    
  4. Specificare attributi per il controllo.Provide attributes for your control. Gli attributi attivano una finestra di progettazione per visualizzare correttamente il controllo e le relative proprietà ed eventi in fase di progettazione.Attributes enable a visual designer to display your control and its properties and events appropriately at design time. Il seguente frammento di codice applica attributi alla proprietà TextAlignment.The following code fragment applies attributes to the TextAlignment property. Nella finestra di progettazione, ad esempio Visual Studio, il Category attributo (mostrato nel frammento di codice), la proprietà da visualizzare in una categoria logica.In a designer such as Visual Studio, the Category attribute (shown in the code fragment) causes the property to be displayed under a logical category. Il Description attributo determina una stringa descrittiva da visualizzare nella parte inferiore del proprietà finestra quando il TextAlignment proprietà è selezionata.The Description attribute causes a descriptive string to be displayed at the bottom of the Properties window when the TextAlignment property is selected. Per altre informazioni sugli attributi, vedere Attributi per componenti in fase di progettazione.For more information about attributes, see Design-Time Attributes for Components.

    [
    Category("Alignment"),
    Description("Specifies the alignment of text.")
    ]
    
    <Category("Alignment"), Description("Specifies the alignment of text.")> _
    Public Property TextAlignment() As ContentAlignment
    
  5. (facoltativo) Specifica risorse per il controllo.(optional) Provide resources for your control. È possibile specificare una risorsa, ad esempio un'immagine bitmap, per il controllo tramite un'opzione del compilatore (/res per C#) per creare pacchetti di risorse con il controllo.You can provide a resource, such as a bitmap, for your control by using a compiler option (/res for C#) to package resources with your control. In fase di esecuzione, è possibile recuperare la risorsa utilizzando i metodi della ResourceManager classe.At run time, the resource can be retrieved using the methods of the ResourceManager class. Per altre informazioni sulla creazione e sull'uso di risorse, vedere Risorse nelle applicazioni desktop.For more information about creating and using resources, see the Resources in Desktop Apps.

  6. Compilare e distribuire il controllo.Compile and deploy your control. Per compilare e distribuire FirstControl,, seguire i passaggi seguenti:To compile and deploy FirstControl, execute the following steps:

    1. Salvare il codice dell'esempio seguente in un file di origine, ad esempio FirstControl.cs o FirstControl.vb.Save the code in the following sample to a source file (such as FirstControl.cs or FirstControl.vb).

    2. Compilare il codice sorgente in un assembly e salvarlo nella directory dell'applicazione.Compile the source code into an assembly and save it in your application's directory. Per questo scopo, eseguire il comando seguente dalla directory che contiene il file d'origine.To accomplish this, execute the following command from the directory that contains the source file.

      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 /t:library indica al compilatore che l'assembly che si sta creando è una libreria e non un file eseguibile.The /t:library compiler option tells the compiler that the assembly you are creating is a library (and not an executable). L'opzione /out specifica il percorso e il nome dell'assembly.The /out option specifies the path and name of the assembly. L'opzione /r specifica il nome delle assembly a cui fa riferimento il codice.The/r option provides the name of the assemblies that are referenced by your code. In questo esempio, si crea un assembly privato che può essere usato solo dalle applicazioni.In this example, you create a private assembly that only your applications can use. Di conseguenza, è necessario salvarlo nella directory dell'applicazione.Hence, you have to save it in your application's directory. Per altre informazioni sulla creazione di pacchetti e sulla distribuzione di un controllo, vedere Distribuzione.For more information about packaging and deploying a control for distribution, see Deployment.

L'esempio seguente visualizza il codice per FirstControl.The following sample shows the code for FirstControl. Il controllo è incluso nello spazio dei nomi CustomWinControls.The control is enclosed in the namespace CustomWinControls. Uno spazio dei nomi specifica un raggruppamento logico di tipi correlati.A namespace provides a logical grouping of related types. È possibile creare il controllo in uno spazio dei nomi nuovo o esistente.You can create your control in a new or existing namespace. In C#, la dichiarazione using (in Visual Basic, Imports) consente di accedere ai tipi da uno spazio dei nomi senza usare il nome completo del tipo.In C#, the using declaration (in Visual Basic, Imports) allows types to be accessed from a namespace without using the fully qualified name of the type. Nell'esempio seguente, il using dichiarazione consente al codice accedere alla classe Control da System.Windows.Forms semplicemente come Control anziché utilizzare il nome completo System.Windows.Forms.Control.In the following example, the using declaration allows code to access the class Control from System.Windows.Forms as simply Control instead of having to use the fully qualified name System.Windows.Forms.Control.

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);

        } 
    }
}
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

Uso del controllo personalizzato in un FormUsing the Custom Control on a Form

L'esempio seguente illustra un form semplice che usa FirstControl.The following example shows a simple form that uses FirstControl. Crea tre istanze di FirstControl, ognuno con un valore diverso per la proprietà TextAlignment.It creates three instances of FirstControl, each with a different value for the TextAlignment property.

Per compilare ed eseguire l'esempioTo compile and run this sample

  1. Salvare il codice dell'esempio seguente in un file di origine (SimpleForm.cs o SimpleForms.vb).Save the code in the following example to a source file (SimpleForm.cs or SimpleForms.vb).

  2. Compilare il codice sorgente in un assembly eseguibile tramite il comando seguente dalla directory che contiene il file di origine.Compile the source code into an executable assembly by executing the following command from the directory that contains the source file.

    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.CustomWinControls.dll is the assembly that contains the class FirstControl. L'assembly deve essere nella stessa directory del file di origine per il form che accede all'assembly (SimpleForm.cs o SimpleForms.vb).This assembly must be in the same directory as the source file for the form that accesses it (SimpleForm.cs or SimpleForms.vb).

  3. Eseguire SimpleForm.exe usando il comando seguente.Execute SimpleForm.exe using the following command.

    SimpleForm  
    
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());
        }


    }
}
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 

Vedere ancheSee Also

Proprietà dei controlli Windows FormProperties in Windows Forms Controls
Eventi dei controlli di Windows FormEvents in Windows Forms Controls