Dibujo con las clases Graphics y Pen

Dibujo con las clases Graphics y Pen

La clase Graphics representa el denominado Contexto de dispositivo gráfico (Graphics device context) sobre el que se va a realizar una operación de dibujo, por ejemplo, el formulario.

Debido a la arquitectura del sistema gráfico, no es posible tomar un objeto Form y realizar una operación directa de dibujo sobre el mismo, sino que precisamos en primer lugar, obtener una referencia hacia el área de dibujo de dicho formulario, o contexto gráfico, y una vez obtenida esa referencia, efectuar el dibujo.

Este área lo vamos a obtener mediante el método CreateGraphics( ) de la clase Form, que devuelve un objeto Graphics con la información del contexto de dispositivo gráfico del formulario, que usaremos para dibujar sobre el mismo, mediante el conjunto de métodos DrawXXX( ).

Por otro lado, la clase Pen representa un objeto de tipo lapicero o bolígrafo, que con un determinado color y grosor, utilizará un objeto Graphics para dibujar líneas y formas en un contexto de dispositivo, es decir, el formulario.

El Código fuente 535 muestra un ejemplo de dibujo de un círculo sobre el formulario utilizando el método DrawEllipse( ) de Graphics. Este método recibe como parámetro un objeto Pen con un color y grosor determinados y un objeto Rectangle con las coordenadas y medida necesarias para dibujar el círculo.

' crear objeto Pen Dim oPen As New Pen(Color.DeepPink, 10)

' obtener el contexto de dispositivo ' gráfico del formulario Dim oGraphics As Graphics = Me.CreateGraphics()

' dibujar en el formulario oGraphics.DrawEllipse(oPen, New Rectangle(150, 20, 100, 100))

Código fuente 535

Asociando este código a la pulsación de un botón en el formulario, el resultado será el dibujo del círculo mostrado en la Figura 325.

© Grupo EIDOS 35. GDI+. Acceso al subsistema gráfico de Windows

Figura 325. Dibujar un círculo con un objeto Pen.

Sin embargo, el dibujo de figuras de esta manera tiene un inconveniente, puesto que si el formulario es ocultado parcial o totalmente por otro, la zona ocultada se dice que ha quedado invalidada, y requiere un repintado, labor que actualmente, no indicamos que se haga en el código del formulario.

Para mantener las figuras dibujadas en el formulario en todo momento, debemos recurrir al evento Paint( ) de la clase Form. Dicho evento se produce cada vez que el formulario necesita repintarse porque parte o la totalidad de su superficie ha quedado invalidada

Vamos por lo tanto a observar las diferencias codificando el mencionado evento Paint( ), en el que dibujaremos un rectángulo. Ver Código fuente 536.

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

' crear objeto Pen Dim oPen As New Pen(Color.MediumVioletRed, 6)

' obtener el contexto de dispositivo ' gráfico del formulario; ' en este caso usaremos el objeto que contiene ' los argumentos de evento para obtener dicho ' contexto de dispositivo Dim oGraph As Graphics = e.Graphics

' dibujar en el formulario oGraph.DrawRectangle(oPen, New Rectangle(40, 80, 70, 70))

End Sub

Código fuente 536

Al ejecutar el programa, el rectángulo será mostrado en todo momento, aunque minimicemos el formulario, lo ocultemos parcial, totalmente, etc., ya que este evento se ejecuta automáticamente cada vez que el formulario detecta que su superficie ha quedado invalidada y necesita repintarse. La Figura 326 muestra el formulario con ambas figuras dibujadas, si ocultamos y mostramos de nuevo la ventana, comprobaremos como el círculo ha desaparecido mientras que el rectángulo persiste.

Programación con Visual Basic .NET © Grupo EIDOS

Figura 326. Figuras dibujadas en la superficie del formulario desde un botón y el evento Paint.

El proyecto GraficosGDI (hacer clic aquí para acceder a este ejemplo), contiene a través de las opciones de sus menús, el conjunto de operaciones de dibujo que describiremos seguidamente.

Mediante el menú Dibujo con Pen, dibujaremos un círculo, rectángulo, curva, polígono, etc. Consulte el lector sus opciones para comprobar el código para cada tipo de figura. A continuación comentaremos las más destacables.

Al dibujar un rectángulo vamos a modificar el estilo de línea mediante la propiedad DashStyle. Esta propiedad contiene una enumeración con la que podemos hacer que la línea se muestre como guiones, guiones y puntos, etc. Ver Código fuente 537.

Private Sub mnuPenRectangulo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuPenRectangulo.Click

' crear objeto Pen Dim oPen As New Pen(Color.Firebrick, 4)

' aplicar un estilo de línea con la propiedad ' DashStyle --> guión, punto oPen.DashStyle = Drawing.Drawing2D.DashStyle.DashDot

' obtener el contexto de dispositivo ' gráfico del formulario Dim oGraphics As Graphics = Me.CreateGraphics()

' dibujar en el formulario oGraphics.DrawRectangle(oPen, New Rectangle(280, 75, 120, 40))

End Sub

Código fuente 537

Si queremos aplicar más estilos a la línea del objeto Pen, disponemos también de las propiedades StartCap, EndCap, DashCap. El Código fuente 538 muestra el dibujo de una curva con varios efectos

de línea. Al dibujar una curva, necesitamos pasar al método DrawCurve( ) un array de tipos Point, con las coordenadas de referencia a usar para el dibujo de la curva.

Private Sub mnuPenCurva_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuPenCurva.Click

© Grupo EIDOS 35. GDI+. Acceso al subsistema gráfico de Windows

' crear objeto Pen Dim oPen As New Pen(Color.MediumPurple, 5)

' configurar estilo de línea oPen.DashStyle = Drawing.Drawing2D.DashStyle.DashDot oPen.StartCap = Drawing.Drawing2D.LineCap.Triangle oPen.EndCap = Drawing.Drawing2D.LineCap.DiamondAnchor oPen.DashCap = Drawing.Drawing2D.DashCap.Triangle

' obtener el contexto de dispositivo ' gráfico del formulario Dim oGraphics As Graphics = Me.CreateGraphics()

' crear un array de puntos-coordenadas necesario ' para dibujar una curva Dim oPuntos(4) As Point oPuntos(0) = New Point(10, 200) oPuntos(1) = New Point(40, 100) oPuntos(2) = New Point(100, 20) oPuntos(3) = New Point(130, 100) oPuntos(4) = New Point(200, 200)

' dibujar en el formulario oGraphics.DrawCurve(oPen, oPuntos)

End Sub

Código fuente 538

En cuanto a las curvas de tipo Bezier, el método DrawBezier( ) recibe como parámetros, el objeto Pen y una lista de coordenadas para el dibujo. Ver el Código fuente 539.

Private Sub mnuPenBezier_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuPenBezier.Click

' dibujar curva estilo Bezier Dim oGraphics As Graphics = Me.CreateGraphics() oGraphics.DrawBezier(New Pen(Color.MediumSeaGreen, 2), 20, 45, 100, 90, 140,

End Sub

Código fuente 539

La Figura 327 muestra todas las formas dibujadas con objetos Pen. Si en un momento dado, necesitamos borrar los elementos gráficos dibujados en la superficie del

formulario, utilizaremos el método Invalidate( ) de la clase Form, que en este ejemplo está disponible en la opción de menú Abrir + Borrar. Ver Código fuente 540.

Private Sub mnuBorrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuBorrar.Click

' borrar las figuras dibujadas en el formulario Me.Invalidate()

End Sub

Código fuente 540

Programación con Visual Basic .NET © Grupo EIDOS

Figura 327. Figuras dibujadas con objetos de la clase Pen.