Marzo 2003
Cipriano Valdezate Sayalero y Manuel Valdezate Sayalero
Trayectos
Sería muy interesante construir una clase que generara un deteminado dibujo para poder plasmarlo cuantas veces quisiéramos y donde quisiéramos. VSNET nos ofrece una. Se trata de GraphicsPath. GraphicsPath tiene estructura de colección, de tal modo que podemos añadir y/o eliminar a discreción las formas componentes del dibujo. El dibujo resultante queda así encapsulado dentro de un objeto de tipo GraphicsPath.
Además, GraphicsPath nos regala una capacidad añadida: el punto inicial de cada forma se conecta con el final de la forma anterior, a menos que lo impidamos invocando al método StartFigure(). Por eso se llama Path (camino, ruta), porque, salvo prohibición vía código, todas las formas se conectan formando una línea que las atraviesa a todas, formando su trayectoria, de ahí mi traducción de “trayecto”.
El siguiente ejemplo muestra la potencia de este objeto al reutilizarse para dibujar un eje cartesiano de coordenadas sobre una superficie milimetrada. He aquí nuestro objetivo:
Y aquí el código:
Private Sub DibujaGrid()
Dim i As Short
Dim Intervalo As Integer
Dim Lienzo As Graphics = Me.CreateGraphics
'Definimos tres objetos GraphicsPath
'uno encapsulará los dos ejes
'otro encapsulará la cuadrícula gruesa y el tercero la fina
Dim Ejes As New GraphicsPath()
With Ejes
'Eje horizontal
'La diferencia entre Me.Height y Me.ClientSize.Height
'es que Me.Height mide la distancia entre los dos bordes,
'mientras que Me.ClientSize.Height toma en cuenta sólo el área cliente.
'El área cliente es la superficie del formulario en la que
'se pueden depositar controles. Por tanto, están excluidos
'del área cliente la barra de título y los bordes
.AddLine(New Point(Me.ClientSize.Width / 2, 0), (New Point(Me.ClientSize.Width / 2, Me.ClientSize.Height)))
.StartFigure() 'para que no una los dos ejes con otra línea
.AddLine(New Point(0, Me.ClientSize.Height / 2), New Point(Me.ClientSize.Width, Me.ClientSize.Height / 2))
End With
'el método DrawPath toma como argumentos
'un lapicero y un trayecto
'Aquí el trayecto lo devuelve la función Grid
'escrita a continuación
'Primero dibujamos la cuadrícula fina
Lienzo.DrawPath(New Pen(Color.LightGreen, 1), Grid(Me, 10))
Lienzo.DrawPath(New Pen(Color.LightGreen, 2), Grid(Me, 50)) 'luego la gorda
Lienzo.DrawPath(New Pen(Color.HotPink, 4), Ejes) 'y al final los ejes
'El orden es importante porque determina qué líneas pasan por encima de cuáles
Lienzo.Dispose() 'Al final cerramos el objeto Graphics
End Sub
Private Function Grid(ByVal Formulario As Form, ByVal Intervalo As Integer) As GraphicsPath
Dim i As Short
'Necesitamos saber el resto obtenido de dividir la anchura o la altura
'por la distancia entre cada línea recogida en el parámetro Intervalo
'Para ello el operador mod nos viene que ni pintado.
'Dividimos el resultado por dos para repartir el margen
'a los dos extremos de la cuadrícula
Dim MargenXInicial As Integer = (Formulario.ClientSize.Width Mod Intervalo) / 2
Dim MargenYInicial As Integer = (Formulario.ClientSize.Height Mod Intervalo) / 2
Dim Trayecto As New GraphicsPath()
With Trayecto
'Comenzando por el margen inicial, vamos dibujando líneas
'guardando entre ellas la distancia que nos indica la variable Intervalo
'Líneas verticales
For i = MargenXInicial To Me.Width - MargenXInicial Step Intervalo
.AddLine(New Point(i, 0), New Point(i, Me.ClientSize.Height))
.StartFigure()
Next
'Líneas horizontales
For i = MargenYInicial To Me.Height - MargenYInicial Step Intervalo
.AddLine(New Point(0, i), New Point(Me.ClientSize.Width, i))
.StartFigure()
Next
End With
Return Trayecto
End Function