Tutorial: actualización de una aplicación de Visual Basic 6.0 con la versión actual de Visual Basic

Actualización: noviembre 2007

En este tutorial, actualizará una aplicación de ejemplo de gráficos de Visual Basic a Visual Basic 2008. Además de ilustrar el proceso de actualización, este tutorial resalta las diferencias entre las arquitecturas gráficas de Visual Basic 6.0 y Visual Basic 2008. Debe servir también como introducción a los temas de arquitectura de las aplicaciones.

La aplicación de ejemplo, en este caso, es un simple formulario que contiene dos botones, un cuadro de imagen, un temporizador y un control de imagen oculto. Aunque no es lo habitual en la mayoría de las aplicaciones que deseará actualizar, presenta ciertos aspectos complejos con los que se encontrará cuando actualice sus aplicaciones.

Nota:

Este tutorial requiere tener instalado Visual Basic 6.0 en el equipo de desarrollo.

Para crear la aplicación de Visual Basic 6.0

  1. Abra Visual Basic 6.0. En el menú Archivo, seleccione Nuevo proyecto.

  2. En el cuadro de diálogo Nuevo proyecto, elija EXE estándar y haga clic en Aceptar.

  3. Agregue un control PictureBox al formulario y dimensiónelo para rellenar la mayor parte del formulario, dejando espacio al final.

  4. Establezca la propiedad AutoRedraw en True, la propiedad DrawStyle en 0-Solid y la propiedad FillStyle en 0-Solid.

  5. Agregue dos controles CommandButton bajo el control PictureBox.

  6. Seleccione el primer CommandButton y establezca la propiedad Name en ClearPictureBox y la propiedad Caption en Clear.

  7. Seleccione el segundo CommandButton y establezca la propiedad Name en ShowImage y la propiedad Caption en Show Image.

  8. Agregue un control Image al formulario y establezca la propiedad Name en sourceImage y la propiedad Visible en False.

  9. Establezca la propiedad Picture del control Image en una imagen de mapa de bits. Puede utilizar una de las imágenes de la carpeta Mis imágenes.

  10. Agregue un control Timer al formulario. Establezca la propiedad Enabled en False y la propiedad Interval en 25.

  11. Haga doble clic en el formulario para abrir el Editor de código y escriba el código siguiente.

    Option Explicit
    Private LeftPos As Double
    
    Private Sub ClearPictureBox_Click()
        Picture1.Cls
    End Sub
    
    Private Sub ShowImage_Click()
        LeftPos = 1
        Me.Timer1.Enabled = True
    End Sub
    
    Private Sub Timer1_Timer()
    
        If LeftPos <= 0 Then
            Me.Timer1.Enabled = False
            Picture1.Print "Visual Basic ROCKS!"
        Else
            LeftPos = LeftPos - 0.01
            Picture1.Cls
            Picture1.PaintPicture sourceImage, LeftPos * _
    Picture1.Width, 0
        End If
    End Sub
    
  12. Presione F5 para ejecutar la aplicación. Haga clic en los botones para observar el comportamiento y recorra el código para ver cómo funciona.

  13. En el menú Archivo, seleccione Guardar archivo como.

  14. En el cuadro de diálogo Guardar archivo como, guarde el formulario como PicForm.frm y el proyecto como Drawing.vbp.

Para ejecutar el Asistente para actualización

  1. Abra Visual Basic 2008. En el menú Archivo, seleccione Abrir proyecto.

  2. En el cuadro de diálogo Abrir proyecto, busque el archivo Drawing.vbp y ábralo.

    Se iniciará el Asistente para actualización de Visual Basic. La primera página del asistente contiene una explicación de lo que hará el asistente.

  3. Haga clic en Next para ir a la segunda página del asistente. Esta página presenta opciones para la actualización; en este caso, no está disponible ninguna opción.

  4. Haga clic en Next para ir a la tercera página del asistente. Haga clic en Next para aceptar la ubicación predeterminada para el nuevo proyecto o escriba una ubicación diferente. La ubicación predeterminada es una nueva carpeta inmediatamente debajo de la carpeta del proyecto de Visual Basic 6.0.

    Si se le pide que cree una nueva carpeta, elija Sí.

  5. En la cuarta página del Asistente, haga clic en Next para iniciar la actualización.

    Cuando termine la actualización, se cerrará el asistente y aparecerá el nuevo proyecto en el Explorador de soluciones.

Para ver los resultados de la actualización

  1. En el Explorador de soluciones, seleccione _UpgradeReport.htm y haga doble clic en él para abrir el informe de actualización.

    Observe que el informe no muestra ninguna cuestión global que requiera atención; para PicForm.vb muestra seis errores y ninguna advertencia.

    Nota:

    Si hubiera advertencias, aparecerían también en la ventana Lista de tareas como elementos UPGRADE_WARNING. Las advertencias corresponden a código que puede causar sutiles diferencias en el comportamiento de la aplicación en tiempo de ejecución. Si hace doble clic en UPGRADE_WARNING en la ventana Lista de tareas, irá directamente al código que debe modificarse.

  2. Haga clic en el signo más de la columna New Filename para expandir la columna PicForm.vb. Mostrará así una lista detallada de los problemas de actualización del formulario.

    Observe que los problemas se encuentran en tres ubicaciones diferentes: el procedimiento ClearPictureBox_Click, el procedimiento Timer1_Timer y el diseño de formulario. Puede hacer clic en el vínculo Descripción para mostrar un tema de Ayuda que explique cada problema. Los problemas de diseño, en este caso, no requieren atención; al consultar la Ayuda comprobará que corresponden a dos propiedades del control PictureBox de Visual Basic 6.0 que no se pueden asignar a propiedades equivalentes de Visual Basic 2008.

Para solucionar el error ClearPictureBox_Click

  1. En el Explorador de soluciones, seleccione PicForm.vb. En el menú Ver, elija Código.

  2. En el Editor de código, seleccione el procedimiento ClearPictureBox_Click.

    Sugerencia:

    Al procedimiento se agrega un comentario UPGRADE_ISSUE. Si se desplaza al final del comentario, puede hacer clic en el vínculo que muestra el tema de Ayuda asociado. Todas las cuestiones (excepto las de diseño) se agregan como comentarios de código durante la actualización, incluidos los comentarios UPGRADE_NOTE que explican lo que ocurrió durante la actualización; éstos no aparecen en el informe de actualización.

  3. Agregue el código siguiente al procedimiento ClearPictureBox_Click:

    Dim g As Graphics = Picture1.CreateGraphics()
    g.Clear(Picture1.BackColor)
    g.Dispose()
    

    El único error del procedimiento original es la llamada al método Picture1.Cls(). En Visual Basic 2008, los controles intrínsecos no proporcionan acceso directo a las superficies de dibujo mediante métodos (como en Visual Basic 6.0). Todas las operaciones gráficas se controlan con un objeto especial de tipo Graphics. Para tener acceso a la superficie de diseño de un control, llame al método CreateGraphics() para obtener una instancia de un objeto Graphics.

  4. Elimine o convierta en comentario la línea original, Picture1.Cls().

Para solucionar los errores Timer1_Timer

  1. En el Editor de código, seleccione el procedimiento Timer1_Tick.

    Nota:

    El evento Timer del control Timer de Visual Basic 6.0 se actualiza al evento Tick del componente Timer de Visual Basic 2008. El Informe de actualización muestra el nombre del evento antiguo; el Editor de código utiliza el nombre del evento nuevo.

  2. Al principio de la función, agregue el código siguiente:

    Dim g As Graphics = Picture1.CreateGraphics()
    

    Como en el procedimiento anterior, los errores que aparecen aquí empiezan con la falta de un objeto Graphics.

  3. Busque la primera UPGRADE_ISSUE, el método Picture1.Print. Agregue el código siguiente:

    g.DrawString("VB .NET ROCKS!", Me.Font, New SolidBrush( _
      Color.Yellow), 0, 0)
    

    El método DrawString del objeto Graphics reemplaza el método Print de Visual Basic 6.0. Donde el método Print aceptaba un solo argumento Text, DrawString también acepta argumentos que especifican el objeto Font, un objeto Brush que especifica un objeto Color y las coordenadas de inicio para dibujar el texto.

  4. Elimine o convierta en comentario la línea original, Picture1.Print("Visual Basic ROCKS!").

  5. Busque la siguiente UPGRADE_ISSUE, Picture1.Cls(). Reemplace el código por el siguiente:

    g.Clear(Picture1.BackColor)
    
  6. Busque la última UPGRADE_ISSUE, Picture1.PaintPicture. Agregue el código siguiente:

    g.DrawImage(sourceImage.Image, CSng(LeftPos * Picture1.Size.Width), _
      0)
    

    En este caso, el método DrawImage de la clase Graphics reemplaza el método PaintPicture.

  7. Elimine o convierta en comentario la línea original, Picture1.PaintPicture(sourceImage, LeftPos * VB6.PixelsToTwipsX(Picture1.Width), 0).

  8. Al final del procedimiento, agregue el código siguiente:

    g.Dispose()
    

    El método Dispose es necesario para liberar los recursos de memoria asociados al objeto Graphics.

Para probar la aplicación

  1. En el menú Depurar, haga clic en Iniciar.

    Nota:

    si se le pide que guarde el archivo de la solución, haga clic en Guardar para guardar el archivo y ejecutar la aplicación.

  2. Haga clic en el botón ShowImage.

    Observará que la imagen parpadea al dibujarse. Esto se debe a que se borra toda el área antes de dibujar cada imagen actualizada en la pantalla.

Modificar la aplicación

Aquí, la solución consiste en dibujar sólo las partes necesarias de la pantalla, en lugar del área completa representada por el objeto Graphics. Deseará asegurarse de que cuando se dibuje la imagen en la pantalla, los píxeles de la pantalla que queden de la última llamada a DrawImage() estén oscurecidos por el color del fondo. Dado que la imagen se mueve de izquierda a derecha, sólo tendrá que oscurecer los píxeles adicionales a la derecha de la imagen.

Para solucionar el problema de parpadeo de la pantalla

  1. En el procedimiento Timer1_Tick, reemplace el método g.Clear(Picture1.BackColor) por el código siguiente:

    Dim imageWidth As Integer = sourceImage.Image.Width
    Dim imageHeight As Integer = sourceImage.Image.Height
    Dim left As Double = imageWidth + (Picture1.Size.Width * LeftPos)
    
    g.FillRectangle(New SolidBrush(Me.BackColor), _
      New Rectangle(left, 0, 6, imageHeight))
    

    En lugar del método Clear, utilice el método FillRectangle, utilizando el color del fondo para oscurecer los píxeles restantes a la derecha de la imagen actual que se está dibujando. Para hacer esto, deberá calcular primero la coordenada del extremo izquierdo del rectángulo, de lo que se ocupan las tres primeras líneas de código.

  2. En el menú Depurar, haga clic en Iniciar.

  3. Haga clic en el botón ShowImage.

    Observará que la imagen ya no parpadea al moverse.

Aún queda un problema adicional que debe resolverse. Quizá haya notado que el mensaje mostrado en el control PictureBox tiene un tamaño de fuente más pequeño que el original. Esto se debe a que la propiedad Font del control PictureBox de la aplicación de Visual Basic 6.0 estaba definida como Arial Negrita 16 en tiempo de diseño. No hay ninguna propiedad Font para el control PictureBox de Visual Basic 2008; en su lugar, se utiliza la fuente predeterminada (Me.Font) del formulario. Puede remediar esto declarando un objeto Font nuevo.

Para corregir la fuente

  1. En el procedimiento Timer1_Tick, agregue la siguiente declaración:

    Dim f As System.Drawing.Font = New System.Drawing.Font("Arial", _
      16, FontStyle.Bold)
    
  2. En la llamada a g.DrawString, cambie el parámetro de fuente de Me.Font a f.

  3. En el menú Depurar, haga clic en Iniciar.

  4. Haga clic en el botón ShowImage.

    El texto aparece ahora con la fuente correcta.

Ahora que la aplicación está en las mismas condiciones que la aplicación original para Visual Basic 6.0, agregará algo de código para mejorarla. Después de todo, no hay necesidad de actualizar la aplicación si no desea sacar partido de Visual Basic 2008.

En el paso siguiente, agregará funcionalidad para hacer que el formulario se desvanezca lentamente al cerrarse.

Nota:

El efecto de desvanecimiento no resulta visible en pantallas de 256 colores; deberá establecer la profundidad de color en Color de alta densidad o Color verdadero para ver los resultados. La propiedad Opacity funciona únicamente en Windows XP.

Para mejorar la aplicación

  1. En el Editor de código, seleccione la lista desplegable Nombre de clase y elija (Eventos de Form1).

  2. En el cuadro de lista desplegable Nombre de método, seleccione el evento FormClosing.

  3. En el procedimiento Form1_FormClosing, agregue el código siguiente:

    Dim i As Single
    For i = 1 To 0 Step -0.1
      Me.Opacity = i
      Application.DoEvents()
      System.Threading.Thread.Sleep(100)
    Next
    
  4. En el menú Depurar, haga clic en Iniciar.

  5. Cierre el formulario y observe cómo desaparece gradualmente.

    Para controlar la velocidad a la que desaparece, puede aumentar el tamaño del paso (o reducir el retardo Sleep).

Vea también

Conceptos

Gráficos para usuarios de Visual Basic 6.0

Referencia

Información general sobre formularios Windows Forms

Otros recursos

Actualizar desde Visual Basic 6.0