Colaboraciones en el Guille

GDI+  Trabajando con Lápices

Líneas y Curvas con animación

 

Fecha: 26/Oct/2005 (25 de Octubre de 2005)
Autor: Ing. Fernando Luque Sánchez
DCE 2003: 4 Estrellas
DCE 2005: 2 Estrellas

[email protected]


Sres Desarrolladores, presento en esta oportunidad un ejemplo de como manejar lápices (Pens) y sus variantes. En artículos anteriores he descrito el uso de diferentes tipos de gráficos usando GDI+.

Los enlaces son:

1.       GDI+ Gráficos en Visual Basic: Textos Artísticos
http://www.elguille.info/colabora/NET2005/FernandoLuque_GDITexto01.htm

2.       GDI+ Gráficos en Visual Basic: Textos con sombra
      http://www.elguille.info/colabora/NET2005/FernandoLuque_GDITexto02.htm

 

3.       GDI+ Gráficos en Visual Basic: Textos en contorno
http://www.elguille.info/colabora/NET2005/FernandoLuque_GDITexto03.htm

4.       GDI+ Gráficos en Visual Basic: Textos Block, Cursiva y Reflejo
      http://www.elguille.info/colabora/NET2005/FernandoLuque_GDITexto04.htm

5.       GDI+  Crear gráficos permanentes
       http://www.elguille.info/colabora/NET2005/FernandoLuque_GraficosPermanentes.htm

Respecto a los manejadores puedes consultar el siguiente artículo:
http://www.elguille.info/colabora/NET2005/FernandoLuque_Controlando_Eventos_y_Arreglos.htm

 

ALGO DE TEORIA

La forma de dibujar usando GDI+, que es una interfaz de Programación de Aplicaciones (API) que se expone a través de un conjunto de clases implementadas como código administrado, utiliza los diversos métodos  de la clase Graphics algunos de los cuales los podemos encontrar en la siguiente tabla:

 
Método Descripción
DrawLine Dibuja una línea que conecta los dos puntos especificados por los pares de coordenadas.
DrawLines Dibuja una serie de segmentos de línea que conectan una matriz de estructuras Point.
DrawArc Dibuja un archivo que representa una parte de una elipse especificada por un par de coordenadas, un valor de ancho y un valor de alto.
DrawCurve Dibuja una curva spline cardinal a través de una matriz especificada de estructuras Point.
DrawBezier
DrawBeziers
Dibuja una o una serie de curvas spline de Bézier a partir de una matriz de estructuras Point
DrawRectangle
DrawRectangles
Dibuja una serie de rectángulos especificados por las estructuras Rectangle
DrawPolygon Dibuja un polígono definido por una matriz de estructuras Point

 

 NUESTRO EJEMPLO

 El formulario tiene el siguiente diseño:

Trabajando con Lápices

 

A continuación sigue código en Visual Basic:

AL CARGAR EL FORMULARIO

    Private Sub Cargar(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load

        ' Estilo
        cboEstilo.Items.Add(DashStyle.Solid)
        cboEstilo.Items.Add(DashStyle.Dash)
        cboEstilo.Items.Add(DashStyle.DashDot)
        cboEstilo.Items.Add(DashStyle.DashDotDot)
        cboEstilo.Items.Add(DashStyle.Dot)
        cboEstilo.Items.Add(DashStyle.Custom)

        ' Combo para el inicio de la Flecha
        cboInicioFlecha.Items.Add(LineCap.DiamondAnchor)
        cboInicioFlecha.Items.Add(LineCap.ArrowAnchor)
        cboInicioFlecha.Items.Add(LineCap.DiamondAnchor)
        cboInicioFlecha.Items.Add(LineCap.Flat)
        cboInicioFlecha.Items.Add(LineCap.Round)
        cboInicioFlecha.Items.Add(LineCap.RoundAnchor)

        ' Combo para el Final de la Flecha
        cboFinalFlecha.Items.Add(LineCap.DiamondAnchor)
        cboFinalFlecha.Items.Add(LineCap.ArrowAnchor)
        cboFinalFlecha.Items.Add(LineCap.DiamondAnchor)
        cboFinalFlecha.Items.Add(LineCap.Flat)
        cboFinalFlecha.Items.Add(LineCap.Round)
        cboFinalFlecha.Items.Add(LineCap.RoundAnchor)

        ' El Relleno
        cboRelleno.Items.Add(DashCap.Flat)
        cboRelleno.Items.Add(DashCap.Round)
        cboRelleno.Items.Add(DashCap.Triangle)

        ' Unión de Líneas
        cboUnion.Items.Add(LineJoin.Bevel)
        cboUnion.Items.Add(LineJoin.Miter)
        cboUnion.Items.Add(LineJoin.MiterClipped)
        cboUnion.Items.Add(LineJoin.Round)  

         ' Alineación
        cboAlinear.Items.Add(PenAlignment.Center)
        cboAlinear.Items.Add(PenAlignment.Inset)
        cboAlinear.Items.Add(PenAlignment.Left)
        cboAlinear.Items.Add(PenAlignment.Outset)
        cboAlinear.Items.Add(PenAlignment.Right)

    End Sub

LOS MANEJADORES

'Manejadores para todos los controles
'cboForma.SelectedIndexChanged, udAncho.ValueChanged,
'txtColor.TextChanged, cboAlinear.SelectedIndexChanged,
'cboInicioFlecha.SelectedIndexChanged, cboFinalFlecha.SelectedIndexChanged,

'cboRelleno.SelectedIndexChanged, cboEstilo.SelectedIndexChanged,
'udLimite.ValueChanged, cboTransforma.SelectedIndexChanged,
'cboPincel.SelectedIndexChanged, cboUnion.SelectedIndexChanged

AddHandler cboForma.SelectedIndexChanged, AddressOf Dibujar
AddHandler udAncho.ValueChanged, AddressOf Dibujar
AddHandler txtColor.TextChanged, AddressOf Dibujar
AddHandler cboAlinear.SelectedIndexChanged, AddressOf Dibujar
AddHandler cboInicioFlecha.SelectedIndexChanged, AddressOf Dibujar
AddHandler cboFinalFlecha.SelectedIndexChanged, AddressOf Dibujar
AddHandler cboRelleno.SelectedIndexChanged, AddressOf Dibujar
AddHandler cboEstilo.SelectedIndexChanged, AddressOf Dibujar
AddHandler udLimite.ValueChanged, AddressOf Dibujar
AddHandler cboTransforma.SelectedIndexChanged, AddressOf Dibujar
AddHandler cboPincel.SelectedIndexChanged, AddressOf Dibujar
AddHandler cboUnion.SelectedIndexChanged, AddressOf Dibujar

El PROCEDIMIENTO QUE DIBUJA

    'Definir el procedimiento Dibujar para cuando el Formulario se Activa
    'Los Manejadores se insertaron en el Constructor usando AddHandler

    Private Sub Dibujar(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Activated  

        ' Elimina el gráfico
        pcDibujo.CreateGraphics().Clear(pcDibujo.BackColor)
        pcDibujo.Refresh()
        ' Elimina Transformación
        vLapiz.ResetTransform()
        ' Relleno personalizado
        vLapiz.DashPattern = New Single() {0.5, 0.25, 0.75, 1.5}

        'PARA EL COLOR O RELLENO DEL LAPIZ
        If optColor.Checked Then   ' Seleccionada la opción de Color
            vLapiz.Color = vLapizColor

        Else   'Lápiz con Brush

            'TIPO DE PINCEL
            Select Case cboPincel.Text
                Case "Solid"
                    'Pincel y lápiz del mismo color
                    vPincel = New SolidBrush(vLapizColor)
                Case "Hatch"
                    'TIPO DE BRUSH
                    vPincel = New HatchBrush(HatchStyle.DarkVertical, vLapizColor)
                Case "Texture"
                    ' TEXTURA - UNA IMAGEN
                    vPincel = New TextureBrush( _
                        New Bitmap("..\Textura.jpg"), WrapMode.Tile)
                Case "Gradient"
                    'DEGRADE
                    vPincel = New LinearGradientBrush( _
                        New Point(0, 0), _
                        New Point(pcDibujo.Width, pcDibujo.Height), _
                        Color.Chocolate, Color.DarkBlue)
            End Select
            vLapiz.Brush = vPincel
        End If

        'Valores para los elementos del lápiz
        vLapiz.Width = udAncho.Value 'Ancho
        vLapiz.DashStyle = CType(cboEstilo.SelectedItem, DashStyle)  'Estilo linea
        vLapiz.MiterLimit = udLimite.Value  'Limite
        vLapiz.StartCap = CType(cboInicioFlecha.SelectedItem, LineCap) 'inicio flecha
        vLapiz.EndCap = CType(cboFinalFlecha.SelectedItem, LineCap)  'Final Flecha
        vLapiz.DashCap = CType(cboRelleno.SelectedItem, DashCap) ' DashCap 
        vLapiz.LineJoin = CType(cboUnion.SelectedItem, LineJoin) ' Unión
        vLapiz.Alignment = CType(cboAlinear.SelectedItem, PenAlignment) 'Alinear.

        ' Transformación
        Select Case cboTransforma.Text
            Case "None"
                ' Elimina la Transformación
                vLapiz.ResetTransform()
            Case "Scale"
                vLapiz.ScaleTransform(0.5, 2)
            Case "Rotate"
                vLapiz.RotateTransform(45)
            Case "Translate"
                vLapiz.TranslateTransform(2, 4)
        End Select

         'Crear
        grafico = pcDibujo.CreateGraphics()

        If Me.cboForma.Text = "Líneas" Then
            ' Dibujar líneas simples usando vLapiz 
            grafico.DrawLine(vLapiz, 50, 50, pcDibujo.Width - 35, 35)
            grafico.DrawLine(vLapiz, 35, 80, 35, pcDibujo.Height - 35)
            grafico.DrawLine(vLapiz, 120, 120, pcDibujo.Width - 35, _
                pcDibujo.Height - 35)

           'Usando VLapizAncho para el efecto
            grafico.DrawLine(vLapizAncho, 50, 50, pcDibujo.Width - 35, 35)
            grafico.DrawLine(vLapizAncho, 35, 80, 35, pcDibujo.Height - 35)
            grafico.DrawLine(vLapizAncho, 120, 120, pcDibujo.Width - 35, _
                 pcDibujo.Height - 35)
        ElseIf Me.cboForma.Text = "Líneas Intersectadas" Then

            ' ´Dibujar Líneas intersactadas, se usa un array de puntos
            Dim ptArray(5) As PointF
            ptArray(0) = New PointF(35, 35)
            ptArray(1) = New PointF(100, pcDibujo.Height - 50)
            ptArray(2) = New PointF(150, 135)
            ptArray(3) = New PointF(pcDibujo.Width - 40, 180)
            ptArray(4) = New PointF(pcDibujo.Width \ 2, pcDibujo.Height - 50)
            ptArray(5) = New PointF(300, 25)  

            ' Dibujar Guia
            grafico.DrawLines(vLapiz, ptArray)
            ' Lápìz ancho
            grafico.DrawLines(vLapizAncho, ptArray)
        ElseIf Me.cboForma.Text = "Círculos y Curvas" Then
            ' Dibujar círculo y curva
            grafico.DrawEllipse(vLapiz, 25, 25, 200, 200)
            grafico.DrawArc(vLapiz, 255, 5, pcDibujo.Width - 255, _
                pcDibujo.Height - 55, 10, 150)

            'Làpiz ancho
            grafico.DrawEllipse(vLapizAncho, 25, 25, 200, 200)
            grafico.DrawArc(vLapizAncho, 255, 5, pcDibujo.Width - 255, _
                pcDibujo.Height - 55, 10, 150)
        End If
    End Sub

 

El código completo se encuentra en el archivo adjunto al final del artículo, no olvides de votar antes de bajarlo en la casilla que se encuentra al inicio en la parte izquierda de la página, eso me anima a seguir publicando. Cualquier consulta no dudes en escribir, conforme el tiempo me lo permita contestaré todas sus dudas.

Ing. Fernando Luque Sánchez
De Trujillo - Perú para el mundo entero


Espacios de nombres usados en el código de este artículo:

System.Drawing.Drawing2D


Fichero con el código de ejemplo: FernandoLuque_GDILapices.zip - (92) KB


ir al índice principal del Guille