Controles personalizados (Windows Forms .NET)

Con Windows Forms puede desarrollar e implementar nuevos controles. Puede crear un control de usuario, modificar los controles existentes a través de la herencia o escribir un control personalizado que realice su propia representación. En este artículo se destacan las diferencias entre los distintos tipos de controles de los que puede heredar, y se proporciona información sobre cómo elegir un tipo de control determinado para el proyecto.

Importante

La documentación de la guía de escritorio para .NET 7 y .NET 6 está en proceso de elaboración.

Clase de control base

Control es la clase base para los controles de Windows Forms. Proporciona la infraestructura necesaria para la presentación visual en aplicaciones de Windows Forms y ofrece las funciones siguientes:

  • Expone un identificador de ventana.
  • Administra el enrutamiento de los mensajes.
  • Proporciona eventos de teclado y mouse, y muchos otros eventos de interfaz de usuario.
  • Proporciona características de diseño avanzadas.
  • Contiene muchas propiedades específicas de la presentación visual, como ForeColor, BackColor, Height y Width.

Como la clase base proporciona gran parte de la infraestructura, es relativamente fácil desarrollar controles de Windows Forms propios.

Creación de su propio control

Hay tres tipos de controles personalizados que puede crear: controles de usuario, controles extendidos y controles personalizados. La tabla siguiente le ayuda a decidir qué tipo de control debe crear:

Si ... Cree un ...
  • Quiere combinar la funcionalidad de varios controles de Windows Forms en una sola unidad reutilizable.
Diseñe un control de usuario que se herede de System.Windows.Forms.UserControl.
  • La mayor parte de la funcionalidad que necesita es idéntica a la de un control de Windows Forms existente.
  • No necesita una interfaz gráfica de usuario personalizada, o bien quiere diseñar una interfaz gráfica de usuario nueva para un control existente.
Extienda un control que se herede de un control de Windows Forms específico.
  • Quiere proporcionar una representación gráfica personalizada del control.
  • Necesita implementar funcionalidad personalizada que no está disponible en los controles estándar.
Cree un control personalizado que se herede de System.Windows.Forms.Control.

Controles de usuario

Un control de usuario es una colección de controles de Windows Forms presentados como un único control para el consumidor. Este tipo de control se conoce como un control compuesto. Los controles contenidos se denominan controles constituyentes.

El control de usuario conserva toda la funcionalidad inherente asociada a cada uno de los controles de Windows Forms contenidos y permite exponer y enlazar sus propiedades de forma selectiva. Un control de usuario también proporciona gran parte de la funcionalidad predeterminada del teclado sin ningún esfuerzo de desarrollo adicional de parte suya.

Un ejemplo de control de usuario podría ser un control creado para mostrar los datos de dirección de los clientes de una base de datos. Este control incluiría un control DataGridView para mostrar los campos de la base de datos, BindingSource para controlar el enlace a un origen de datos y un control BindingNavigator para desplazarse por los registros. Las propiedades de enlace de datos se podrían exponer de forma selectiva, y el control completo se podría empaquetar y reutilizar en distintas aplicaciones.

Para obtener más información, consulte Información general sobre el control de usuario.

Controles extendidos

Puede derivar un control heredado de cualquier control de Windows Forms existente. Este enfoque permite conservar toda la funcionalidad inherente de un control de Windows Forms y, después, ampliarla mediante la adición de propiedades, métodos u otras características personalizadas. Con esta opción, puede invalidar la lógica de dibujo del control base y, a continuación, cambiar la apariencia de la interfaz de usuario para extenderla.

Por ejemplo, puede crear un control derivado de Button que realiza el seguimiento de cuántas veces un usuario ha hecho clic en él.

En algunos controles, también puede agregar una apariencia personalizada a la interfaz gráfica del control si invalida el método OnPaint de la clase base. Para un botón extendido que realiza el seguimiento de los clics, puede invalidar el método OnPaint para llamar a la implementación base de OnPaint y, después, dibujar el recuento de clics en una esquina del área cliente del control Button.

Controles personalizados

Otra forma de crear un control consiste en hacerlo prácticamente desde el principio si se hereda de Control. La clase Control proporciona toda la funcionalidad básica necesaria para los controles, incluido el control de eventos del mouse y el teclado, pero ninguna funcionalidad específica del control ni la interfaz gráfica.

Para crear un control que se herede de la clase Control se necesita más esfuerzo que heredar de UserControl o de un control de Windows Forms existente. Como puede realizar gran parte de la implementación, el control puede tener mayor flexibilidad que un control compuesto o ampliado, y puede personalizar el control exactamente para sus necesidades.

Para implementar un control personalizado, debe escribir código para el evento OnPaint del control, que controla cómo se dibuja visualmente el control. También debe escribir cualquier comportamiento específico de la característica para el control. También puede invalidar el método WndProc y controlar los mensajes de Windows directamente. Esta es la manera más eficaz de crear un control, pero para utilizar esta técnica de forma eficaz, debe estar familiarizado con la API Win32 de Microsoft®.

Un ejemplo de un control personalizado es un control de reloj que reproduce la apariencia y el funcionamiento de un reloj analógico. Se invoca la representación personalizada para hacer que las manecillas del reloj se muevan en respuesta a los eventos Tick desde un componente interno Timer.

Experiencia de diseño personalizada

Si necesita implementar una experiencia personalizada en tiempo de diseño, puede crear su propio diseñador. En el caso de los controles compuestos, derive la clase de diseñador personalizada de las clases ParentControlDesigner o DocumentDesigner. En el caso de los controles extendidos y personalizados, derive la clase de diseñador personalizada de la clase ControlDesigner.

Use DesignerAttribute para asociar el control al diseñador.

La siguiente información no está actualizada, pero puede ayudarle.