Gráficos para usuarios de Visual Basic 6.0

Actualización: noviembre 2007

En Visual Basic 6.0, se usaban diversos métodos y propiedades de gráficos para dibujar en un control Form o PictureBox. En Visual Basic 6.0 los gráficos se basan en las API de la interfaz de dispositivo gráfico (GDI) de Windows.

En Visual Basic 2008, el espacio de nombres System.Drawing, que encapsula las API de GDI+, proporciona los gráficos. GDI+ expande las funciones gráficas de Visual Basic 6.0 pero los métodos no son compatibles.

Diferencias conceptuales

En Visual Basic 6.0, los métodos de gráficos sólo se aplican al objeto Form y al control PictureBox.

En Visual Basic 2008, los métodos de gráficos se aplican a los formularios, además de a cualquier control que admita el evento Paint, incluidos los controles PictureBox, Panel y GroupBox. Además, los métodos de gráficos se aplican a cualquier control que admita la propiedad OwnerDraw, incluidos los controles ListView, TreeView y Button.

Propiedad AutoRedraw

En Visual Basic 6.0, se puede llamar a los métodos de gráficos desde cualquier procedimiento de evento; la propiedad AutoRedraw se utiliza para conservar los gráficos cuando se llama a los métodos de gráficos desde un evento que no sea el evento Paint.

En Visual Basic 2008, sólo se debe llamar a los métodos de gráficos desde el procedimiento de evento Paint o, en el caso de algunos controles dibujados por el propietario, desde los diversos procedimientos de eventos Draw (DrawItem, DrawSubItem, etc.). Ya no se admite la propiedad AutoRedraw y no es necesaria porque los eventos Paint y Draw conservan automáticamente los gráficos.

Propiedad ClipControls

En Visual Basic 6.0, la propiedad ClipControls se utiliza para controlar el dibujo de un formulario o control. Cuando se establece en True, se vuelven a dibujar sólo las áreas recientemente expuestas, en teoría, con lo que mejora su rendimiento.

No hay ningún equivalente para la propiedad ClipControls en Visual Basic 2008; las mejoras de rendimiento en GDI+ y los adaptadores de vídeo actualizados lo hacen innecesario.

Propiedad DrawMode

En Visual Basic 6.0, la propiedad DrawMode controla el color de un objeto gráfico al dibujar un modelo encima de otro. Esta propiedad sólo afecta a las pantallas monocromas o de baja resolución (256 colores o menos).

No hay ningún equivalente para la propiedad DrawMode en Visual Basic 2008, ya que no es necesaria en las presentaciones actuales.

Propiedad DrawStyle

En Visual Basic 6.0, la propiedad DrawStyle controla el aspecto de una línea dibujada con el método Line. Si la propiedad DrawWidth está establecida en un valor superior a 1, la propiedad DrawStyle no tiene efecto y la línea será siempre una línea continua.

En Visual Basic 2008, la apariencia de una línea se controla estableciendo la propiedad DashStyle de una clase System.Drawing.Pen utilizada por uno de los métodos DrawLine; el ancho de línea no tiene relación con esta propiedad.

Propiedad DrawWidth

En Visual Basic 6.0, la propiedad DrawWidth determina el grosor de una línea de píxeles; la propiedad DrawWidth se establece normalmente antes de ejecutar el método de gráfico.

En Visual Basic 2008, la propiedad Pen.Width de un control System.Drawing.Pen determina el grosor de la línea; puede establecer la propiedad Width como parámetro al crear Pen o establecer Pen.Width después de crear Pen. Si no se especifica ninguna propiedad Pen.Width, 1 píxel es el valor predeterminado.

Propiedad Image

En Visual Basic 6.0 la propiedad Image de un formulario o un control PictureBox devuelve un identificador de un mapa de bits; se puede asignar el identificador a la propiedad Picture o utilizarlo como valor para pasarlo a las llamadas de API de Windows.

En Visual Basic 2008, los mapas de bits ya no tienen identificadores; se pasa el propio mapa de bits como objeto de tipo Bitmap. Se puede asignar un control Bitmap a la propiedad Imagede un control PictureBox pero no es posible pasarlo a las llamadas de API de Windows.

Método Line

En Visual Basic 6.0, el método Line se utiliza para dibujar un rectángulo especificando las coordenadas superior izquierda e inferior, junto con un argumento B opcional. La propiedad FillColor se utiliza para llenar un rectángulo de un color uniforme y la propiedad FillStyle llena el rectángulo de un modelo de sombreado.

En Visual Basic 2008, el método DrawRectangles se utiliza para dibujar el borde de un rectángulo y el método FillRectangle se usa para rellenarlo. FillRectangle acepta un objeto Brush como parámetro. SolidBrush reemplaza a la propiedad FillColor y los miembros de la clase HatchBrush reemplazan a la propiedad FillStyle.

Método Point

En Visual Basic 6.0, el método Point de un formulario o de un control PictureBox se utiliza para devolver un valor de color para el píxel en un punto especificado. Aunque el método Point se puede utilizar para formularios o controles que no contengan imágenes, se suele utilizar sobre todo para recuperar un color de un mapa de bits asignado a la propiedad Picture.

En Visual Basic 2008, el método Point ya no existe. Puede utilizar el método M:System.Drawing.Bitmap.GetPixel(System.Int32,System.Int32) para recuperar un valor de color de un mapa de bits. Para formularios o controles que no contienen imágenes, puede consultar la propiedad BackColor.

Método Print

En Visual Basic 6.0, el método Print se utiliza para mostrar texto de un formulario o en un control PictureBox. La fuente utilizada para mostrar el texto se determina mediante las propiedades Font del formulario o control, y el color, mediante la propiedad ForeColor. El método Print no proporciona ningún control para la ubicación del texto y sólo se puede mostrar texto horizontalmente.

En Visual Basic 2008, el método DrawString se utiliza para mostrar texto. La fuente se determina mediante un objeto Font y el color, mediante un objeto Brush; ambos se pasan como parámetros al método DrawString. El método DrawString también tiene parámetros X e Y que determinan la ubicación de inicio del texto. Existe también un parámetro Format opcional que acepta un objeto StringFormat, lo que permite mostrar el texto verticalmente.

Método PSet

En Visual Basic 6.0, el método PSet se utiliza para cambiar el color de un píxel en un formulario o en un control PictureBox. Si la propiedad DrawWidth se establece en un valor superior a 1, el método PSet dibuja un círculo relleno. Se utiliza un parámetro opcional para especificar el color; si se omite, se utiliza ForeColor .

En Visual Basic 2008, no hay ningún equivalente para el método PSet. Para cambiar el color de un único píxel en un formulario o en el control PictureBox, utilice el método DrawEllipse para dibujar un círculo con un alto y un ancho de 1 píxel. Para duplicar la funcionalidad de PSet cuando DrawWidth es superior a 1, utilice el método FillEllipse.

Cambios de código para gráficos

Los siguientes ejemplos de código muestran las diferencias entre las técnicas de codificación de Visual Basic 6.0 y Visual Basic 2008.

Dibujar una línea simple

El código siguiente muestra el dibujo de una línea en un formulario en tiempo de ejecución. En el ejemplo de Visual Basic 6.0, se utiliza el método Line; acepta las coordenadas X e Y de los puntos de inicio y de fin, y, opcionalmente, un color como argumentos. El ejemplo de Visual Basic 2008 utiliza el método DrawLine que acepta un objeto Pens y las coordenadas X e Y de los puntos inicial y final como argumentos.

Nota:

En Visual Basic 6.0, la unidad de medida predeterminada son los twips; en Visual Basic 2008 son los píxeles.

' Visual Basic 6.0
Private Sub Form_Paint()
    ' Draw a solid black line 200 twips from the top of the form.
    Line (0, 200) - (ScaleWidth, 200), vbBlack
End Sub
' Visual Basic
Private Sub Form1_Paint(ByVal sender As Object, ByVal e _
As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

    ' Draw a solid black line 25 pixels from the top of the form.
    e.Graphics.DrawLine(Pens.Black, 0, 25, Me.Width, 25)
End Sub

Dibujar una línea de puntos

El código siguiente muestra el dibujo de una línea de puntos en un formulario en tiempo de ejecución. En el ejemplo de Visual Basic 6.0, la propiedad DrawStyle determina el aspecto de la línea. El ejemplo de Visual Basic 2008 utiliza un objeto Pen y establece la propiedad DashStyle para determinar la apariencia.

Nota:

En Visual Basic 6.0, la unidad de medida predeterminada son los twips; en Visual Basic 2008 son los píxeles.

' Visual Basic 6.0
Private Sub Form_Paint()
    ' Draw a dotted line 200 twips from the top of the form.
    Me.DrawStyle = vbDot
    Line (0, 200) - (ScaleWidth, 200), vbBlack
End Sub
' Visual Basic
Private Sub Form1_Paint1(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

    ' Draw a dotted black line 25 pixels from the top of the form.
    Dim LPen As New System.Drawing.Pen(System.Drawing.Color.Black)
    LPen.DashStyle = Drawing2D.DashStyle.Dot
    e.Graphics.DrawLine(LPen, 0, 25, Me.Width, 25)
End Sub

Controlar el grosor de la línea

El código siguiente muestra el dibujo de líneas de distintos grosores en un formulario en tiempo de ejecución. En el ejemplo de Visual Basic 6.0, se utiliza la propiedad DrawWidth. El ejemplo de Visual Basic 2008 utiliza la propiedad Width del objeto Pens.

' Visual Basic 6.0
Private Sub Form_Paint()
    ' Draw a line with a thickness of 1 pixel.
    DrawWidth = 1
    Line (0, 200)-(ScaleWidth, 200), vbBlack
    ' Draw a line with a thickness of 5 pixels.
    DrawWidth = 5
    Line (0, 400)-(ScaleWidth, 400), vbBlack
    ' Draw a line with a thickness of 10 pixels.
    DrawWidth = 10
    Line (0, 600)-(ScaleWidth, 600), vbBlack
End Sub
' Visual Basic
Private Sub Form1_Paint2(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

    ' Draw a line with a thickness of 1 pixel.
    Dim TPen As New System.Drawing.Pen(System.Drawing.Color.Black, 1)
    e.Graphics.DrawLine(TPen, 0, 25, Me.Width, 25)
    ' Draw a line with a thickness of 5 pixels.
    TPen.Width = 5
    e.Graphics.DrawLine(TPen, 0, 50, Me.Width, 50)
    ' Draw a line with a thickness of 10 pixels.
    TPen.Width = 10
    e.Graphics.DrawLine(TPen, 0, 75, Me.Width, 75)
End Sub

Dibujar un círculo

El código siguiente muestra el dibujo de un círculo en un formulario en tiempo de ejecución. En el ejemplo de Visual Basic 6.0, se utiliza el método Circle; acepta las coordenadas X e Y del punto central, el radio y, opcionalmente, un color como argumentos. El ejemplo de Visual Basic 2008 utiliza el método DrawEllipse que acepta un objeto Pen, las coordenadas X e Y del ángulo superior izquierdo del rectángulo delimitador, el ancho y el alto como argumentos.

Nota:

En Visual Basic 6.0, la unidad de medida predeterminada son los twips; en Visual Basic 2008 son los píxeles.

' Visual Basic 6.0
Private Sub Form_Paint()
    ' Draw a 1000 twip diameter red circle
    Circle (500, 500), 500, vbRed
End Sub
' Visual Basic
Private Sub Form1_Paint3(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

    ' Draw a 70 pixel diameter red circle.
    e.Graphics.DrawEllipse(Pens.Red, 0, 0, 70, 70)
End Sub

Dibujar un rectángulo relleno.

El código siguiente muestra el dibujo de dos rectángulos en un formulario en tiempo de ejecución, uno con un relleno sólido y el otro con un modelo sombreado. En el ejemplo de Visual Basic 6.0, se utilizan las propiedades FillColor y FillStyle junto con el método Line. Al llamar al método Line con el parámetro B, se dibuja un rectángulo.

El ejemplo de Visual Basic 2008 utiliza el método Graphics.Rectangle para dibujar el contorno y el método Graphics.FillRectangle que acepta un objeto Brush como argumento. En este ejemplo, se utilizan los controles SolidBrush y HatchBrush.

Nota:

En Visual Basic 6.0, la unidad de medida predeterminada son los twips; en Visual Basic 2008 son los píxeles.

' Visual Basic 6.0
Private Sub Form_Paint()
    ' Draw a solid red rectangle.
    FillColor = vbRed
    FillStyle = vbSolid
    Line (10, 10)- (1000, 500), vbRed, B
    ' Draw a rectangle filled with a crosshatch pattern.
    FillColor = vbBlack
    FillStyle = vbCross
    Line (10, 500)- (1000, 1000), vbBlack, B
End Sub
' Visual Basic
Private Sub Form1_Paint4(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

    ' Draw a solid red rectangle.
    Dim SBrush As New System.Drawing.SolidBrush _
      (System.Drawing.Color.Red)
    e.Graphics.DrawRectangle(Pens.Red, 2, 2, 70, 40)
    e.Graphics.FillRectangle(SBrush, 2, 2, 70, 40)

    ' Draw a rectangle filled with a crosshatch pattern.
    Dim HBrush As New System.Drawing.Drawing2D.HatchBrush( _
      System.Drawing.Drawing2D.HatchStyle.Cross, _
      System.Drawing.Color.Black, System.Drawing.Color.Transparent)
    e.Graphics.DrawRectangle(Pens.Black, 2, 40, 70, 40)
    e.Graphics.FillRectangle(HBrush, 2, 40, 70, 40)
End Sub

Mostrar una imagen en un formulario

El código siguiente muestra los métodos de gráficos para mostrar una imagen en un formulario en tiempo de ejecución. El ejemplo de Visual Basic 6.0 utiliza el método PaintPicture. El ejemplo de Visual Basic 2008 utiliza el método DrawImage.

' Visual Basic 6.0
Private Sub Form_Paint()
    ' Create a stdPicture object.
    Dim Pict1 As New stdPicture
    Pict1 = LoadPicture("C:\Windows\Greenstone.bmp")
    PaintPicture Pict1, 0, 0
End Sub
' Visual Basic
Private Sub Form1_Paint5(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

    ' Create a Bitmap object.
    Dim Pict1 As New Bitmap("C:\Windows\Greenstone.bmp")
    e.Graphics.DrawImage(Pict1, 0, 0)
End Sub

Mostrar texto en un formulario

El código siguiente indica los métodos de gráficos para mostrar una cadena de texto en un formulario en tiempo de ejecución. El ejemplo de Visual Basic 6.0 utiliza el método Print. El ejemplo de Visual Basic 2008 utiliza el método DrawString.

' Visual Basic 6.0
Private Sub Form_Paint()
    Me.Font.Size = 24
    Me.Font.Bold = True
    Me.ForeColor = vbRed
    Print "Hello World!"
End Sub
' Visual Basic
Private Sub Form1_Paint6(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

    Dim TextFont As New System.Drawing.Font("Arial", 24, FontStyle.Bold)
    Dim TextBrush As New System.Drawing.SolidBrush(System.Drawing.Color.Red)
    e.Graphics.DrawString("Hello World!", TextFont, TextBrush, 10, 10)
    TextFont.Dispose()
    TextBrush.Dispose()
End Sub

Determinar el alto y ancho de una cadena

El código siguiente muestra los métodos de gráficos para determinar el tamaño de una cadena en un formulario en tiempo de ejecución y dibujar luego un rectángulo alrededor de ella. El ejemplo de Visual Basic 6.0 utiliza los métodos TextHeight y TextWidth. El ejemplo de Visual Basic 2008 utiliza el método MeasureString, que devuelve una estructura SizeF.

' Visual Basic 6.0
Private Sub Form_Paint()
    Me.Font.Size = 24
    Me.Font.Bold = True
    Me.ForeColor = vbRed
    Print "Hello World!"
    Line (0, 0)-(TextWidth("Hello World!"), _
TextHeight("Hello World!")), vbBlack, B 
End Sub
' Visual Basic
Private Sub Form1_Paint7(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

    Dim TextFont As New System.Drawing.Font("Arial", 24, FontStyle.Bold)
    Dim TextBrush As New System.Drawing.SolidBrush(System.Drawing.Color.Red)
    e.Graphics.DrawString("Hello World!", TextFont, TextBrush, 10, 10)
    Dim TextSize As New System.Drawing.SizeF
    TextSize = e.Graphics.MeasureString("Hello World!", TextFont)
    e.Graphics.DrawRectangle(Pens.Black, 10, 10, TextSize.Width, TextSize.Height)
    TextFont.Dispose()
    TextBrush.Dispose()
End Sub

Dibujar un único píxel

El ejemplo siguiente muestra los métodos de gráficos para cambiar el color de un único píxel en un formulario en tiempo de ejecución. El ejemplo de Visual Basic 6.0 utiliza el método PSet. El ejemplo de Visual Basic 2008 utiliza el método DrawEllipse con los parámetros Height y Width establecidos en 1.

Nota    En Visual Basic 6.0, la unidad de medida predeterminada son los twips; en Visual Basic 2008 son los píxeles.

' Visual Basic 6.0
Private Sub Form_Paint()
    Me.DrawWidth = 1
    PSet (1000, 1000), vbRed
End Sub
' Visual Basic
Private Sub Form1_Paint8(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

    e.Graphics.DrawEllipse(Pens.Red, 70, 70, 1, 1)
End Sub

Determinar el color de un único píxel

El código siguiente muestra los métodos de gráficos para determinar el color de un píxel en una ubicación especificada en una imagen de un formulario en tiempo de ejecución y pintar luego un rectángulo relleno de dicho color. El ejemplo de Visual Basic 6.0 utiliza el método Point para recuperar el valor de color. El ejemplo de Visual Basic 2008 utiliza el método GetPixel.

Nota:

En Visual Basic 6.0, la unidad de medida predeterminada son los twips; en Visual Basic 2008 son los píxeles.

' Visual Basic 6.0
Private Sub Form_Paint()
    Dim PixelColor As Long
    Picture1.Picture = LoadPicture("C:\Windows\Greenstone.bmp")
    PixelColor = Picture1.Point(10, 10)
    FillColor = PixelColor
    Line (0, 0)-(100, 500), PixelColor, B
End Sub
' Visual Basic
Private Sub Form1_Paint9(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

    Dim Pict1 As New Bitmap("C:\Windows\Greenstone.bmp")
    Picture1.Image = Pict1
    Dim PixelColor As Color = Pict1.GetPixel(4, 4)
    Dim PixelBrush As New SolidBrush(PixelColor)
    e.Graphics.FillRectangle(PixelBrush, 0, 0, 100, 100)
End Sub

Equivalencias de métodos y propiedades de gráficos

En la siguiente tabla se enumeran propiedades y métodos de gráficos de Visual Basic 6.0, junto con sus equivalentes en Visual Basic 2008.

Visual Basic 6.0

Equivalente en Visual Basic 2008

AutoRedraw (propiedad)

Nueva implementación. Para que los gráficos permanezcan, ponga métodos de gráficos en el evento Paint.

Circle (método)

DrawEllipse (método)

ClipControls (propiedad)

Nueva implementación. La propiedad ClipControls ya no es necesaria.

Cls (método)

Clear (método)

CurrentX (propiedad)

El parámetro x de diversos métodos de gráficos. Por ejemplo, DrawRectangle(pen, x, y, width, height)

CurrentY (propiedad)

El parámetro y de diversos métodos de gráficos. Por ejemplo, DrawRectangle (pen, x, y, width, height)

DrawMode (propiedad)

Nueva implementación. La propiedad DrawMode ya no es necesaria.

DrawStyle (propiedad)

DashStyle (propiedad)

DrawWidth (propiedad)

Width (propiedad)

FillColor (propiedad)

Objeto SolidBrush

FillStyle (propiedad)

Objeto HatchBrush

HasDC (propiedad)

Nueva implementación. Los contextos de dispositivo no son necesarios con GDI+.

HDC (propiedad)

Nueva implementación. Los contextos de dispositivo no son necesarios con GDI+.

Image (propiedad)

Nueva implementación.

Line (método)

DrawLine (método)

PaintPicture (método)

DrawImage (método)

Point (método)

No hay equivalente directo Para los mapas de bits, utilice Bitmap.GetPixel. En formularios o controles, utilice la propiedad BackColor.

Print (método)

DrawString (método)

Pset (método)

DrawEllipse, FillEllipse (métodos)

TextHeight, TextWidth (propiedades)

MeasureString (método)

Notas de actualización

Cuando una aplicación se actualiza de Visual Basic 6.0 a Visual Basic 2008, los métodos de gráficos no se actualizan y se insertan advertencias en el código. Debido a las diferencias considerables entre GDI y GDI+, se deberá reescribir cualquier código de gráfico existente.

Vea también

Tareas

Ejemplo Custom Drawing User Control

Otros recursos

Información general de gráficos (Formularios Windows Forms)

Introducción a la programación de gráficos

Código administrado de GDI+

Utilizar clases gráficas administradas