Representar un control de formularios Windows FormsRendering a Windows Forms Control

Representación se refiere al proceso de creación de una representación visual en pantalla de un usuario.Rendering refers to the process of creating a visual representation on a user's screen. Formularios de Windows usa GDI (la nueva biblioteca de gráficos de Windows) para la representación.Windows Forms uses GDI (the new Windows graphics library) for rendering. Las clases administradas que proporcionan acceso a GDI están en el System.Drawing espacio de nombres y sus subespacios de nombres.The managed classes that provide access to GDI are in the System.Drawing namespace and its subnamespaces.

Los siguientes elementos son necesarios en la representación del control:The following elements are involved in control rendering:

  • La funcionalidad de dibujo proporcionada por la clase base System.Windows.Forms.Control.The drawing functionality provided by the base class System.Windows.Forms.Control.

  • Los elementos fundamentales de la biblioteca de gráficos GDI.The essential elements of the GDI graphics library.

  • La geometría de la región de dibujo.The geometry of the drawing region.

  • El procedimiento para liberar recursos gráficos.The procedure for freeing graphics resources.

Funcionalidad proporcionada por el Control de dibujoDrawing Functionality Provided by Control

La clase base Control proporciona funcionalidad de dibujo a través de su Paint eventos.The base class Control provides drawing functionality through its Paint event. Un control provoca la Paint evento cada vez que necesita actualizar su apariencia.A control raises the Paint event whenever it needs to update its display. Para obtener más información sobre los eventos de .NET Framework, vea controlar y provocar eventos.For more information about events in the .NET Framework, see Handling and Raising Events.

La clase de datos para el Paint eventos, PaintEventArgs, contiene los datos necesarios para dibujar un control, un identificador de un objeto graphics y un objeto de rectángulo que representa la región que se va a dibujar.The event data class for the Paint event, PaintEventArgs, holds the data needed for drawing a control — a handle to a graphics object and a rectangle object that represents the region to draw in. Estos objetos se muestran en negrita en el siguiente fragmento de código.These objects are shown in bold in the following code fragment.

Public Class PaintEventArgs  
   Inherits EventArgs  
   Implements IDisposable  
  
   Public ReadOnly Property ClipRectangle() As System.Drawing.Rectangle  
      ...  
   End Property  
  
   Public ReadOnly Property Graphics() As System.Drawing.Graphics  
      ...  
   End Property  
   ' Other properties and methods.  
   ...  
End Class  
public class PaintEventArgs : EventArgs, IDisposable {  
public System.Drawing.Rectangle ClipRectangle {get;}  
public System.Drawing.Graphics Graphics {get;}  
// Other properties and methods.  
...  
}  

Graphics es una clase administrada que encapsula la funcionalidad de dibujo, como se describe en la descripción de GDI más adelante en este tema.Graphics is a managed class that encapsulates drawing functionality, as described in the discussion of GDI later in this topic. El ClipRectangle es una instancia de la Rectangle estructurar y define el área disponible en el que puede dibujar un control.The ClipRectangle is an instance of the Rectangle structure and defines the available area in which a control can draw. Un desarrollador del control se puede calcular el ClipRectangle utilizando el ClipRectangle propiedad de un control, como se describe en la descripción de geometría más adelante en este tema.A control developer can compute the ClipRectangle using the ClipRectangle property of a control, as described in the discussion of geometry later in this topic.

Un control debe proporcionar lógica de representación al reemplazar el OnPaint método que hereda de Control.A control must provide rendering logic by overriding the OnPaint method that it inherits from Control. OnPaint Obtiene acceso a un objeto graphics y un rectángulo que se va a dibujar a través de la Graphics y ClipRectangle propiedades de la PaintEventArgs instancia pasa a él.OnPaint gets access to a graphics object and a rectangle to draw in through the Graphics and the ClipRectangle properties of the PaintEventArgs instance passed to it.

Protected Overridable Sub OnPaint(pe As PaintEventArgs)  
protected virtual void OnPaint(PaintEventArgs pe);  

El OnPaint método de la base de Control clase no implementa ninguna funcionalidad de dibujo, pero simplemente invoca los delegados de eventos que están registrados con el Paint eventos.The OnPaint method of the base Control class does not implement any drawing functionality but merely invokes the event delegates that are registered with the Paint event. Cuando invalide OnPaint, normalmente se invoca el OnPaint recibe el método de la clase base para que los delegados registrados el Paint eventos.When you override OnPaint, you should typically invoke the OnPaint method of the base class so that registered delegates receive the Paint event. Sin embargo, los controles que dibujan toda su superficie no deben invocar la clase base OnPaint, ya que esto causa parpadeos.However, controls that paint their entire surface should not invoke the base class's OnPaint, as this introduces flicker. Para obtener un ejemplo de cómo reemplazar el OnPaint eventos, consulte el Cómo: Crear un Control de Windows Forms que muestre el progreso.For an example of overriding the OnPaint event, see the How to: Create a Windows Forms Control That Shows Progress.

Nota

No invoque OnPaint directamente desde el control; en su lugar, invoque el Invalidate (método) (se hereda de Control) o algún otro método que invoca Invalidate.Do not invoke OnPaint directly from your control; instead, invoke the Invalidate method (inherited from Control) or some other method that invokes Invalidate. El Invalidate a su vez invoca el método OnPaint.The Invalidate method in turn invokes OnPaint. El Invalidate método está sobrecargado y, dependiendo de los argumentos proporcionados a Invalidate e, un control vuelve a dibujarse algunos o todos de su área de pantalla.The Invalidate method is overloaded, and, depending on the arguments supplied to Invalidate e, a control redraws either some or all of its screen area.

La base de Control clase define otro método que es útil para el dibujo, el OnPaintBackground método.The base Control class defines another method that is useful for drawing — the OnPaintBackground method.

Protected Overridable Sub OnPaintBackground(pevent As PaintEventArgs)  
protected virtual void OnPaintBackground(PaintEventArgs pevent);  

OnPaintBackground pinta el fondo (y, por tanto, la forma) de la ventana y se garantiza que sea rápido, mientras OnPaint dibuja los detalles y puede ser más lento porque las solicitudes de dibujo individuales se combinan en uno Paint evento que cubre todas las áreas que deben ser vuelve a dibujar.OnPaintBackground paints the background (and thereby the shape) of the window and is guaranteed to be fast, while OnPaint paints the details and might be slower because individual paint requests are combined into one Paint event that covers all areas that have to be redrawn. Desea invocar la OnPaintBackground si, por ejemplo, desea que se va a dibujar un fondo de color degradado para el control.You might want to invoke the OnPaintBackground if, for instance, you want to draw a gradient-colored background for your control.

Mientras OnPaintBackground tiene una nomenclatura similar de eventos y acepta los mismos argumentos que el OnPaint método OnPaintBackground no es un método de evento es true.While OnPaintBackground has an event-like nomenclature and takes the same argument as the OnPaint method, OnPaintBackground is not a true event method. No hay ningún PaintBackground eventos y OnPaintBackground no invoca delegados de eventos.There is no PaintBackground event and OnPaintBackground does not invoke event delegates. Cuando se reemplaza el OnPaintBackground método, una clase derivada no es necesaria para invocar el OnPaintBackground método de su clase base.When overriding the OnPaintBackground method, a derived class is not required to invoke the OnPaintBackground method of its base class.

Conceptos básicos GDI +GDI+ Basics

La Graphics clase proporciona métodos para dibujar varias formas como círculos, triángulos, elipses y arcos, así como métodos para mostrar texto.The Graphics class provides methods for drawing various shapes such as circles, triangles, arcs, and ellipses, as well as methods for displaying text. El System.Drawing espacio de nombres y sus subespacios de nombres contienen clases que encapsulan elementos gráficos, como formas (círculos, rectángulos, arcos y otros), los colores, fuentes, pinceles y así sucesivamente.The System.Drawing namespace and its subnamespaces contain classes that encapsulate graphics elements such as shapes (circles, rectangles, arcs, and others), colors, fonts, brushes, and so on. Para obtener más información acerca de GDI, vea Using Managed Graphics Classes.For more information about GDI, see Using Managed Graphics Classes. También se describen los aspectos básicos de GDI en el Cómo: Crear un Control de Windows Forms que muestre el progreso.The essentials of GDI are also described in the How to: Create a Windows Forms Control That Shows Progress.

Geometría de la región de dibujoGeometry of the Drawing Region

El ClientRectangle propiedad de un control especifica la región rectangular disponible para el control en la pantalla del usuario, mientras que el ClipRectangle propiedad de PaintEventArgs especifica el área que se pinta realmente.The ClientRectangle property of a control specifies the rectangular region available to the control on the user's screen, while the ClipRectangle property of PaintEventArgs specifies the area that is actually painted. (Recuerde que la pintura se realiza en el Paint método eventos que tome un PaintEventArgs instancia como su argumento).(Remember that painting is done in the Paint event method that takes a PaintEventArgs instance as its argument). Un control que necesite pintar sólo una parte de su área disponible, como sucede cuando una pequeña sección de cambios de presentación del control.A control might need to paint only a portion of its available area, as is the case when a small section of the control's display changes. En estos casos, un desarrollador del control debe calcular el rectángulo real en a dibujar y lo trasladará al Invalidate.In those situations, a control developer must compute the actual rectangle to draw in and pass that to Invalidate. Las versiones sobrecargadas de Invalidate que toman un Rectangle o Region como argumento, usar ese argumento para generar el ClipRectangle propiedad de PaintEventArgs.The overloaded versions of Invalidate that take a Rectangle or Region as an argument use that argument to generate the ClipRectangle property of PaintEventArgs.

El siguiente fragmento de código se muestra cómo el FlashTrackBar control personalizado calcula el área rectangular que se va a dibujar.The following code fragment shows how the FlashTrackBar custom control computes the rectangular area to draw in. El client variable denota el ClipRectangle propiedad.The client variable denotes the ClipRectangle property. Para obtener un ejemplo completo, vea Cómo: Crear un Control de Windows Forms que muestre el progreso.For a complete sample, see How to: Create a Windows Forms Control That Shows Progress.

Rectangle invalid = new Rectangle(
    client.X + min, 
    client.Y, 
    max - min, 
    client.Height);

Invalidate(invalid);
Dim invalid As Rectangle = New Rectangle( _
    client.X + lmin, _
    client.Y, _
    lmax - lmin, _
    client.Height)

Invalidate(invalid)

Liberar recursos gráficosFreeing Graphics Resources

Objetos gráficos son costosos porque usan los recursos del sistema.Graphics objects are expensive because they use system resources. Estos objetos incluyen instancias de la System.Drawing.Graphics , así como las instancias de la clase System.Drawing.Brush, System.Drawing.Peny otras clases de gráficos.Such objects include instances of the System.Drawing.Graphics class as well as instances of System.Drawing.Brush, System.Drawing.Pen, and other graphics classes. Es importante que cree un recurso de gráficos solo cuando lo necesite y liberarla pronto como haya terminado de usarlo.It is important that you create a graphics resource only when you need it and release it soon as you are finished using it. Si crea un tipo que implementa el IDisposable interfaz, llame a su Dispose método cuando haya terminado con él con el fin de liberar recursos.If you create a type that implements the IDisposable interface, call its Dispose method when you are finished with it in order to free resources.

El siguiente fragmento de código se muestra cómo el FlashTrackBar control personalizado se crea y se libera un Brush recursos.The following code fragment shows how the FlashTrackBar custom control creates and releases a Brush resource. Para el código fuente completo, vea Cómo: Crear un Control de Windows Forms que muestre el progreso.For the complete source code, see How to: Create a Windows Forms Control That Shows Progress.

private Brush baseBackground = null;
Private baseBackground As Brush
base.OnPaint(e);
if (baseBackground == null) {
    if (showGradient) {
        baseBackground = new LinearGradientBrush(new Point(0, 0),
                                                 new Point(ClientSize.Width, 0),
                                                 StartColor,
                                                 EndColor);
    }
    else if (BackgroundImage != null) {
        baseBackground = new TextureBrush(BackgroundImage);
    }
    else {
        baseBackground = new SolidBrush(BackColor);
    }
}
MyBase.OnPaint(e)

If (baseBackground Is Nothing) Then

    If (myShowGradient) Then
        baseBackground = New LinearGradientBrush(New Point(0, 0), _
                                                 New Point(ClientSize.Width, 0), _
                                                 StartColor, _
                                                 EndColor)
    ElseIf (BackgroundImage IsNot Nothing) Then
        baseBackground = New TextureBrush(BackgroundImage)
    Else
        baseBackground = New SolidBrush(BackColor)
    End If

End If
protected override void OnResize(EventArgs e) {
    base.OnResize(e);
    if (baseBackground != null) {
        baseBackground.Dispose();
        baseBackground = null;
    }
}
Protected Overrides Sub OnResize(ByVal e As EventArgs)
    MyBase.OnResize(e)
    If (baseBackground IsNot Nothing) Then
        baseBackground.Dispose()
        baseBackground = Nothing
    End If
End Sub

Vea tambiénSee also