Controles dibujados por el usuario

.NET Framework le ofrece la posibilidad de desarrollar fácilmente sus propios controles. Puede crear un control de usuario, que es un conjunto de controles estándar enlazados por código, o puede diseñar su propio control desde cero. Puede incluso usar la herencia para crear un control que herede de un control existente y agregarlo a su funcionalidad inherente. Sea cual sea el enfoque que use, .NET Framework proporciona funcionalidad para dibujar una interfaz gráfica personalizada para cualquier control que cree.

Para representar un control, hay que ejecutar el código en el método OnPaint del control. El argumento único del método OnPaint es un objeto PaintEventArgs que proporciona toda la información y la funcionalidad necesarias para representar el control. PaintEventArgs proporciona como propiedades dos objetos principales que se usarán en la representación del control:

  • Objeto ClipRectangle: rectángulo que representa la parte del control que se va a dibujar. Puede ser todo el control o parte del control, en función de cómo se dibuje.

  • Objeto Graphics: encapsula varios métodos y objetos orientados a gráficos que proporcionan la funcionalidad necesaria para dibujar el control.

Para obtener más información sobre el objeto Graphics y cómo usarlo, vea Procedimiento para crear objetos de gráficos para dibujar.

El evento OnPaint se desencadena cada vez que el control se dibuja o actualiza en la pantalla, y el objeto ClipRectangle representa el rectángulo en el que tendrá lugar la representación. Si es necesario actualizar todo el control, ClipRectangle representará el tamaño de todo el control. No obstante, si solo es necesario actualizar parte del control, el objeto ClipRectangle solo representará la región que debe volver a dibujarse. Un ejemplo de esto sería cuando otro control o formulario se encontraba oculto parcialmente por un control o formulario en la interfaz de usuario.

Al heredar de la clase Control, se debe invalidar el método OnPaint y proporcionar código de representación de gráficos. Si desea proporcionar una interfaz gráfica personalizada a un control de usuario o a un control heredado, también puede hacerlo invalidando el método OnPaint. A continuación se muestra un ejemplo:

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)  
   ' Call the OnPaint method of the base class.  
   MyBase.OnPaint(e)  
  
   ' Declare and instantiate a drawing pen.  
   Using myPen As System.Drawing.Pen = New System.Drawing.Pen(Color.Aqua)  
      ' Draw an aqua rectangle in the rectangle represented by the control.  
      e.Graphics.DrawRectangle(myPen, New Rectangle(Me.Location, Me.Size))  
   End Using
End Sub  
protected override void OnPaint(PaintEventArgs e)  
{  
   // Call the OnPaint method of the base class.  
   base.OnPaint(e);  
  
   // Declare and instantiate a new pen.  
   using (System.Drawing.Pen myPen = new System.Drawing.Pen(Color.Aqua))  
   {
      // Draw an aqua rectangle in the rectangle represented by the control.  
      e.Graphics.DrawRectangle(myPen, new Rectangle(this.Location,
         this.Size));  
   }
}  

En el ejemplo anterior se muestra cómo representar un control con una representación gráfica muy sencilla. Llama al método OnPaint de la clase base, crea un objeto Pen con el que dibujar y, por último, dibuja una elipse en el rectángulo determinado por los elementos Location y Size del control. Aunque la mayoría del código de representación será significativamente más complicado que esto, en este ejemplo se muestra el uso del objeto Graphics contenido en el objeto PaintEventArgs. Tenga en cuenta que si hereda de una clase que ya tiene una representación gráfica, como UserControl o Button, y no desea incorporar esa representación en su representación, no debe llamar al método OnPaint de la clase base.

El código del método OnPaint del control se ejecutará cuando se dibuje el control por primera vez y siempre que se actualice. Para asegurarse de que el control se vuelve a dibujar cada vez que cambia de tamaño, agregue la siguiente línea al constructor del control:

SetStyle(ControlStyles.ResizeRedraw, True)  
SetStyle(ControlStyles.ResizeRedraw, true);  

Nota

Use la propiedad Control.Region para implementar un control no rectangular.

Consulte también