Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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
Defina una clase que derive de System.Windows.Forms.Control.
Public Class FirstControl Inherits Control ... End Class [C#] public class FirstControl:Control{...}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
TextAlignmentqueFirstControlutiliza 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.
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.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 propiedadTextAlignment. 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 {...}(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.
Compile e implemente el control. Para compilar e implementar
FirstControl, realice los pasos siguientes.Guarde el código del siguiente ejemplo en un archivo de código fuente (como FirstControl.cs o FirstControl.vb).
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
Guarde el código del siguiente ejemplo en un archivo de código fuente (SimpleForm.cs o SimpleForms.vb).
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).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