Compartir a través de


Desarrollar un control sencillo de formularios Windows Forms

En esta sección se ofrece un tutorial que describe los pasos básicos para crear un control de formularios Windows Forms personalizado. El control sencillo desarrollado en este tutorial permite modificar la alineación de su propiedad Text. No provoca ni controla eventos.

Para crear un control personalizado sencillo

  1. Defina una clase que derive de System.Windows.Forms.Control.

    Public Class FirstControl
       Inherits Control
       ...
    End Class
    [C#]
    public class FirstControl:Control{...}
    
  2. Defina propiedades. (No es necesario definir propiedades ya que los controles heredan muchas de la clase Control, aunque para la mayoría de los controles personalizados se suelen definir propiedades adicionales.) El fragmento de código siguiente define una propiedad denominada TextAlignment queFirstControlutiliza para dar formato a la apariencia de la propiedad Text heredada de Control. Para obtener más información sobre cómo definir las propiedades, vea Información general sobre propiedades.

    ' ContentAlignment is an enumeration defined in the System.Drawing
    ' namespace that specifies the alignment of content on a drawing 
    ' surface.
    Private alignment As ContentAlignment = ContentAlignment.MiddleLeft
    
    Public Property TextAlignment() As ContentAlignment
      Get
         Return alignment
      End Get
      Set
         alignment = value
         ' The Invalidate method invokes the OnPaint method described 
         ' in step 3.
         Invalidate()
      End Set
    End Property
    [C#]
    // ContentAlignment is an enumeration defined in the System.Drawing
    // namespace that specifies the alignment of content on a drawing 
    // surface.
    private ContentAlignment alignment = ContentAlignment.MiddleLeft;
    
    public ContentAlignment TextAlignment {
       get {
          return alignment;
       }
       set {
          alignment = value;
          // The Invalidate method invokes the OnPaint method described 
          // in step 3.
          Invalidate(); 
       }
    }
    

    Cuando se define una propiedad que cambia la apariencia visual del control, se debe invocar el método Invalidate para volver a dibujar el control. Invalidate se define en la clase base Control.

  3. Reemplace el método protegido OnPaint heredado de Control para proporcionar lógica de procesamiento al control. Si no reemplaza OnPaint, el control no podrá dibujarse a sí mismo. En el siguiente fragmento de código, el método OnPaint muestra la propiedad Text heredada de Control con una alineación predeterminada.

    Public Class FirstControl
       Inherits Control
    
       Public Sub New()
          ...
       End Sub
    
       Protected Overrides Sub OnPaint(e As PaintEventArgs)
          MyBase.OnPaint(e)
          e.Graphics.DrawString(Text, Font, New SolidBrush(ForeColor), RectangleF.op_Implicit(ClientRectangle), style)
       End Sub
    End Class
    [C#]
    public class FirstControl : Control{
       public FirstControl() {...}
       protected override void OnPaint(PaintEventArgs e) {
          base.OnPaint(e);
          e.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), ClientRectangle, style);
       } 
    }
    

    El código anterior muestra un texto con la alineación predeterminada. El código de ejemplo al final de este tema muestra cómo se cambia la alineación de Text por la que especifica la propiedad TextAlignment, que se definió en el paso 2 anteriormente en esta misma sección.

  4. Proporcione atributos para el control. Los atributos permite a los diseñadores visuales mostrar el control y sus propiedades y evento correctamente en tiempo de diseño. El fragmento de código siguiente aplica atributos a la propiedad TextAlignment. En un diseñador como Microsoft Visual Studio.NET, el atributo Category (que aparece en el fragmento de código) hace que se muestre la propiedad en una categoría lógica. El atributo Description hace que se muestre una cadena descriptiva en la parte inferior de la ventana Propiedades cuando se selecciona la propiedad TextAlignment. Para obtener más información, vea Atributos de tiempo de diseño para componentes.

    <Category("Alignment"), _
    Description("Specifies the alignment of text.")> _  
    Public Property TextAlignment() As ContentAlignment
       ...
    End Class
    [C#]
    [
    Category("Alignment"),
    Description("Specifies the alignment of text.")
    ]
    public ContentAlignment TextAlignment {...}
    
  5. (opcional) Proporcione recursos para el control. Para proporcionar un recurso, como un mapa de bits, al control, utilice una opción del compilador (/res para C#) para empaquetar recursos con el control. En tiempo de ejecución, el recurso puede recuperarse utilizando los métodos de la clase System.Resources.ResourceManager. Para obtener más información sobre cómo crear y utilizar los recursos, vea el tutorial Ejemplos de. NET: procedimientos: recursos.

  6. Compile e implemente el control. Para compilar e implementar FirstControl, realice los pasos siguientes.

    1. Guarde el código del siguiente ejemplo en un archivo de código fuente (como FirstControl.cs o FirstControl.vb).

    2. Compile el código fuente en un ensamblado y guárdelo en el directorio de la aplicación. Para ello, ejecute el siguiente comando desde el directorio que contiene el archivo de código fuente.

      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

      La opción del compilador /t:library indica al compilador que el ensamblado que se está creando es una biblioteca (y no un ejecutable). La opción /out especifica la ruta de acceso y el nombre del ensamblado. La opción /r indica el nombre de los ensamblados a los que hace referencia el código. En este ejemplo, se crea un ensamblado privado que sólo pueden utilizar sus aplicaciones. Por tanto, debe guardarlo en el directorio de su aplicación. Para obtener más información sobre cómo empaquetar e implementar un control para su distribución, vea Implementar aplicaciones de .NET Framework.

En el siguiente ejemplo se muestra el código de FirstControl. El control está incluido en el espacio de nombres CustomWinControls. Un espacio de nombres proporciona una agrupación lógica de tipos relacionados. El control se puede crear en un espacio de nombres nuevo o en uno existente. En C#, la declaración using (en Visual Basic, Imports) permite el acceso a los tipos desde un espacio de nombres sin utilizar el nombre completo del tipo. En el siguiente ejemplo, la declaración using permite al código tener acceso a la clase Control desde System.Windows.Forms sencillamente como Control en lugar de tener que utilizar el nombre completo System.Windows.Forms.Control.

Option Explicit
Option Strict

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

Namespace CustomWinControls
   Public Class FirstControl
      Inherits Control
      Private alignment As ContentAlignment = ContentAlignment.MiddleLeft

      <Category("Alignment"), _
      Description("Specifies the alignment of text.")> _
      Public Property TextAlignment() As ContentAlignment
         Get
            Return alignment
         End Get
         Set
            alignment = value
            ' The Invalidate method invokes the OnPaint method.
            Invalidate()
         End Set
      End Property
      
      ' OnPaint aligns text, as specified by the 
      ' TextAlignment property, by passing a parameter
      ' to the DrawString method of the System.Drawing.Graphics object.
      Protected Overrides Sub OnPaint(e As PaintEventArgs)
         MyBase.OnPaint(e)
         Dim style As New StringFormat()
         style.Alignment = StringAlignment.Near
         Select Case alignment
            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(Text, Font, New SolidBrush(ForeColor), RectangleF.op_Implicit(ClientRectangle), style)
      End Sub
   End Class
End Namespace
[C#]
namespace CustomWinControls {
   using System;
   using System.ComponentModel;
   using System.Windows.Forms;
   using System.Drawing;
   public class FirstControl : Control {
      private ContentAlignment alignment = ContentAlignment.MiddleLeft;
      
      [
       Category("Alignment"),
       Description("Specifies the alignment of text.")
      ]
      public ContentAlignment TextAlignment {
         get {
            return alignment;
         }
         set {
            alignment = value;
            // The Invalidate method invokes the OnPaint method.
            Invalidate();
         }
      }

      // OnPaint aligns text, as specified by the 
      // TextAlignment property, by passing a parameter
      // to the DrawString method of the System.Drawing.Graphics object.
      protected override void OnPaint(PaintEventArgs e) {
         base.OnPaint(e);
         StringFormat style = new StringFormat();
         style.Alignment = StringAlignment.Near;
         switch (alignment) {
            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);
      }
   }
}

Utilizar el control personalizado en un formulario

El siguiente ejemplo muestra un formulario sencillo que utiliza FirstControl. Crea tres instancias de FirstControl, cada una con un valor distinto de la propiedad TextAlignment.

Para compilar y ejecutar este ejemplo

  1. Guarde el código del siguiente ejemplo en un archivo de código fuente (SimpleForm.cs o SimpleForms.vb).

  2. Compile el código fuente en un ensamblado ejecutable; para ello, ejecute el siguiente comando desde el directorio que contiene el archivo de código fuente.

    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 es el ensamblado que contiene la clase FirstControl. Este ensamblado debe encontrarse en el mismo directorio que el archivo de código fuente del formulario que tiene acceso a él. (SimpleForm.cs o SimpleForms.vb).

  3. Ejecute SimpleForm.exe con el siguiente comando.

    SimpleForm

Option Explicit
Option Strict

Imports System
Imports System.Windows.Forms
Imports System.Drawing
Imports CustomWinControls

Class SimpleForm
   Inherits Form
   Private leftControl As FirstControl
   Private centerControl As FirstControl
   Private rightControl As FirstControl
   
   Protected Overloads Overrides Sub Dispose(disposing as Boolean)
      MyBase.Dispose(disposing)
   End Sub
   
   
   Public Sub New()
      leftControl = New FirstControl()
      With leftControl
         .Text = "Left"
         .Location = New Point(50, 50)
         .Size = New Size(50, 50)
      End With
      Controls.Add(leftControl)
      
      centerControl = New FirstControl()
      With centerControl
         .TextAlignment = ContentAlignment.MiddleCenter
         .Text = "Center"
         .Location = New Point(125, 50)
         .Size = New Size(50, 50)
      End With
      Controls.Add(centerControl)
      
      rightControl = New FirstControl()
      With rightControl
         .TextAlignment = ContentAlignment.MiddleRight
         .Text = "Right"
         .Location = New Point(200, 50)
         .Size = New Size(50, 50)
      End With
      Controls.Add(rightControl)
   End Sub

   <STAThread()> _
   Public Shared Sub Main()
      Dim myForm As New SimpleForm()
      myForm.Text = "Uses FirstControl"
      myForm.Size = New Size(400, 150)
      Application.Run(myForm)
   End Sub
End Class
[C#]
using System;
using System.Windows.Forms;
using System.Drawing;
using CustomWinControls;

class SimpleForm : Form {
   private FirstControl left;
   private FirstControl center;
   private FirstControl right;
   
   protected override void Dispose(bool disposing) {
      base.Dispose(disposing);
   }

   public SimpleForm() : base() {
      left = new FirstControl();
      left.Text = "Left";
      left.Location = new Point(50, 50);
      left.Size = new Size(50, 50);
      Controls.Add(left);
      
      center = new FirstControl();
      center.TextAlignment = ContentAlignment.MiddleCenter;
      center.Text = "Center";
      center.Location = new Point(125, 50);
      center.Size = new Size(50, 50);
      Controls.Add(center);
      
      right = new FirstControl();
      right.TextAlignment = ContentAlignment.MiddleRight;
      right.Text = "Right";
      right.Location = new Point(200, 50);
      right.Size = new Size(50, 50);
      Controls.Add(right);
   }
   
   [STAThread]
   public static void Main(string[] args) {
      Form form = new SimpleForm();
      form.Text = "Uses FirstControl";
      form.Size = new Size(400, 150);
      Application.Run(form);
   }
}

Vea también

Propiedades de los controles de formularios Windows Forms Eventos de los controles de formularios Windows Forms