Пошаговое руководство. Обновление приложения Visual Basic 6.0 до текущей версии языка Visual Basic

Обновлен: Ноябрь 2007

В этом пошаговом руководстве рассматривается процесс обновления образца графического приложения Visual Basic до версии Visual Basic 2008. Помимо процесса обновления, освещаются различия в графической архитектуре между Visual Basic 6.0 и Visual Basic 2008. Этот документ также может использоваться для решения проблем, связанных с архитектурой приложения.

В данном случае, приложение представляет собой простую форму, содержащую две кнопки, окно рисунка, таймер и скрытый элемент управления "Изображение" (image). Не являясь типичным для большинства приложений, требующих обновления, оно все же дает представление о некоторых проблемах, которые могут возникнуть в процессе обновления приложений.

zbyth951.alert_note(ru-ru,VS.90).gifПримечание.

Для изучения данного пошагового руководства на используемом для разработки компьютере должен быть установлен Visual Basic 6.0.

Создание нового приложения Visual Basic 6.0

  1. Откройте Visual Basic 6.0. В меню Файл выберите пункт Новый проект.

  2. В диалоговом окне Новый проект выберите вариант Стандартный EXE-файл и нажмите кнопку ОК.

  3. Добавьте на форму элемент управления PictureBox и измените его размер так, чтобы заполнить большую часть площади формы, оставив место в нижней части.

  4. Присвойте свойству AutoRedraw значение True, свойству DrawStyle значение 0-Solid и свойству FillStyle значение 0-Solid.

  5. Добавьте два элемента управления CommandButton под элементом управления PictureBox.

  6. Выберите первый элемент управления CommandButton и присвойте свойству Name значение ClearPictureBox и свойству Caption значение Clear.

  7. Выберите второй элемент управления CommandButton и присвойте свойству Name значение ShowImage, а свойству Caption — значение Show Image.

  8. Добавьте на форму элемент управления Image и присвойте свойству Name значение sourceImage, а свойству Visible — значение False.

  9. Установите в качестве значения свойства Picture элемента управления Image любое растровое изображение. Можно воспользоваться одним из рисунков из папки "Мои рисунки".

  10. Добавьте на форму элемент управления Timer. Присвойте свойству Enabled значение False, а свойству Interval — значение "25".

  11. Затем дважды щелкните форму, чтобы открыть редактор кода, и введите следующий код.

    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. Нажмите клавишу F5 для запуска приложения. Нажимайте кнопки, чтобы понаблюдать за их действием, и выполните код в пошаговом режиме, чтобы посмотреть, как он работает.

  13. В меню Файл выберите команду Сохранить проект как.

  14. В диалоговом окне Сохранение файла сохраните форму под именем PicForm.frm, а проект под именем Drawing.vbp.

Запуск мастера обновления

  1. Откройте Visual Basic 2008. В меню Файл выберите Открыть проект.

  2. В диалоговом окне Открытие проекта найдите файл Drawing.vbp и откройте его.

    В результате будет запущен мастер обновления Visual Basic. На первой странице мастера содержатся пояснения его действий.

  3. Нажмите кнопку "Далее" (Next), чтобы перейти на вторую страницу мастера. На ней представлены варианты обновления; в данном случае их изменение невозможно.

  4. Нажмите кнопку "Далее" (Next) для перехода к третей странице мастера. Нажмите кнопку "Далее" (Next) для подтверждения расположения по умолчанию для нового проекта или укажите другое расположение. При выборе расположения по умолчанию проект будет сохранен в новую папку в папке проектов Visual Basic 6.0.

    Нажмите кнопку Да, если будет предложено создать новую папку.

  5. На четвертой странице мастера нажмите кнопку "Далее" Next для начала обновления.

    По завершении обновления окно мастера будет закрыто, а новый проект появится в Обозревателе решений.

Изучение результатов обновления

  1. Для просмотра отчета об обновлении в обозревателе решений выберите файл _UpgradeReport.htm и откройте его двойным щелчком.

    Обратите внимание, что в отчете не указаны глобальные неполадки, которые необходимо устранить; для файла PicForm.vb будет показано шесть ошибок и ноль предупреждений.

    zbyth951.alert_note(ru-ru,VS.90).gifПримечание.

    В случае наличия предупреждений они были бы показаны в окне Список задач в качестве элементов UPGRADE_WARNING. Предупреждения связаны с кодом, который может привести к появлению незначительных отличий в поведении приложения во время выполнения. По двойному щелчку элемента UPGRADE_WARNING в окне Список задач выполняется переход непосредственно к коду, который может нуждаться в изменении.

  2. Разверните раздел PicForm.vb, щелкнув знак "плюс" (+) в столбце Новое имя файла. Здесь отображается подробный список проблем, возникших при обновлении формы.

    Обратите внимание, что выделено три проблемы: процедура ClearPictureBox_Click, процедура Timer1_Timer и макет формы. Чтобы отобразить раздел справки, поясняющий каждую из них, щелкните ссылку Описание. В данном случае проблемы, связанные с макетом формы, не требуют никаких действий; прочитав справку, можно понять, что они возникают из-за того, что для двух свойств элемента управления PictureBox Visual Basic 6.0 нет соответствующих эквивалентных свойств в Visual Basic 2008.

Исправление ошибки в процедуре ClearPictureBox_Click

  1. В Обозревателе решений выберите файл PicForm.vb. В меню Вид выберите пункт Код.

  2. В редакторе кода выберите процедуру ClearPictureBox_Click.

    zbyth951.alert_note(ru-ru,VS.90).gifСовет.

    К этой процедуре добавлен комментарий UPGRADE_ISSUE (ПРОБЛЕМА ОБНОВЛЕНИЯ). Выполнив прокрутку к концу комментария, можно щелкнуть ссылку, в результате чего на экране появится соответствующий раздел справки. При обновлении все проблемы (за исключением проблем с макетом) добавляются в виде комментариев к коду, включая комментарии UPGRADE_NOTE (ПРИМЕЧАНИЕ ПО ОБНОВЛЕНИЮ), поясняющие, что произошло при обновлении; в отчете об обновлении они не отображаются.

  3. В процедуру ClearPictureBox_Click добавьте следующий код:

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

    Единственной ошибкой в исходном коде будет вызов метода Picture1.Cls(). В версии Visual Basic 2008 встроенные элементы управления не предоставляют прямого доступа к их поверхности рисования с использованием методов (как в Visual Basic 6.0). Все графические операции обрабатываются специальным объектом типа Graphics. Доступ к поверхности рисования элемента управления можно получить, вызвав метод CreateGraphics(), чтобы получить экземпляр объекта Graphics.

  4. Удалите или закомментируйте исходную строку: Picture1.Cls().

Исправление ошибки в процедуре Timer1_Timer

  1. В редакторе кода выберите процедуру Timer1_Tick.

    zbyth951.alert_note(ru-ru,VS.90).gifПримечание.

    Событие Timer элемента управления Timer Visual Basic 6.0 обновлено до события Tick, включенного в компонент TimerVisual Basic 2008. В отчете об обновлении показано прежнее название события; в редакторе кода используется новое название.

  2. Добавьте в начало функции следующий код:

    Dim g As Graphics = Picture1.CreateGraphics()
    

    Первая ошибка здесь, как и в предыдущей процедуре, возникает из-за отсутствия объекта Graphics.

  3. Найдите первый комментарий UPGRADE_ISSUE около метода Picture1.Print. Добавьте следующий код:

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

    Метод DrawString объекта Graphics заменяет метод Print Visual Basic 6.0. В то время как метод Print принимает один аргумент Text, метод DrawString также принимает аргументы, определяющие параметр Font, объект Brush, определяющий объект Color, и начальные координаты прорисовки текста.

  4. Удалите или закомментируйте исходную строку: Picture1.Print("Visual Basic ROCKS!").

  5. Найдите следующий комментарий UPGRADE_ISSUE около метода Picture1.Cls(). Замените код следующим:

    g.Clear(Picture1.BackColor)
    
  6. Найдите последний комментарий UPGRADE_ISSUE около метода Picture1.PaintPicture. Добавьте следующий код:

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

    В этом случае метод DrawImage класса Graphics замещает метод PaintPicture.

  7. Удалите или закомментируйте исходную строку: Picture1.PaintPicture(sourceImage, LeftPos * VB6.PixelsToTwipsX(Picture1.Width), 0).

  8. В конце процедуры добавьте следующий код:

    g.Dispose()
    

    Метод Dispose необходим для освобождения ресурсов памяти, занятых объектом Graphics.

Проверка работы приложения

  1. В меню Отладка выберите команду Пуск.

    zbyth951.alert_note(ru-ru,VS.90).gifПримечание.

    Если на экране появится предложение сохранить файл решения, нажмите кнопку Сохранить, чтобы сохранить файл и запустить приложение.

  2. Нажмите кнопку ShowImage.

    Обратите внимание, что изображение мерцает во время прорисовки. Это происходит из-за того, что вся внутренняя область удаляется каждый раз перед выводом обновленного рисунка на экран.

Дальнейшее изменение приложения

Проблему можно решить, если перерисовывать только необходимые части экрана, а не всю внутреннюю область, представленную объектом Graphics. Легко заметить, что при прорисовке изображения на экране точки, оставшиеся от последнего вызова метода DrawImage(), скрываются цветом фона. Поскольку изображение перемещается справа налево, требуется скрывать только дополнительные точки, находящиеся справа от рисунка.

Устранение мерцания экрана

  1. В процедуре Timer1_Tick замените метод g.Clear(Picture1.BackColor) следующим кодом:

    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))
    

    Вместо метода Clear воспользуйтесь методом FillRectangle, который скрывает оставшиеся справа от прорисовываемого в данный момент изображения точки цветом фона. Для этого нужно рассчитать крайнюю левую координату прямоугольника, что реализуется в первых трех строках кода.

  2. В меню Отладка выберите команду Пуск.

  3. Нажмите кнопку ShowImage.

    Обратите внимание, что изображение больше не мерцает во время перемещения.

Необходимо решить еще одну проблему. Возможно, вы обратили внимание, что отображаемое в элементе управления PictureBox сообщение имеет меньший размер шрифта, чем в исходной версии приложения. Это происходит потому, что в режиме разработки для свойства Font элемента управления PictureBox в Visual Basic 6.0 было задано значение Arial Bold 16. Свойство Font в существующем в Visual Basic 2008 элементе управления PictureBox отсутствует; вместо него в качестве шрифта формы по умолчанию используется параметр (Me.Font). Это можно исправить, объявив новый объект Font.

Исправление шрифта

  1. В процедуре Timer1_Tick добавьте следующее объявление:

    Dim f As System.Drawing.Font = New System.Drawing.Font("Arial", _
      16, FontStyle.Bold)
    
  2. В вызове метода g.DrawString измените параметр шрифта с Me.Font на f.

  3. В меню Отладка выберите команду Пуск.

  4. Нажмите кнопку ShowImage.

    Теперь текст отображается правильным шрифтом.

Добившись идентичности обновленного приложения с исходным приложением Visual Basic 6.0, добавьте код для усовершенствования приложения. В конечном итоге, нет смысла обновлять приложение, если нет желания использовать преимущества Visual Basic 2008.

При выполнении следующего этапа добавляются функции, обеспечивающие плавное исчезновение формы при закрытии.

zbyth951.alert_note(ru-ru,VS.90).gifПримечание.

Эффект исчезновения не виден в режиме 256 цветов; для использования эффекта необходимо установить глубину цвета High Color или True Color. Свойство Opacity работает только в операционной системе Windows XP.

Улучшение приложения

  1. Откройте редактор кода, в раскрывающемся списке Имя класса выберите элемент (События Form1).

  2. В раскрывающемся списке Имя метода выберите событие FormClosing.

  3. В процедуру Form1_FormClosing добавьте следующий код:

    Dim i As Single
    For i = 1 To 0 Step -0.1
      Me.Opacity = i
      Application.DoEvents()
      System.Threading.Thread.Sleep(100)
    Next
    
  4. В меню Отладка выберите команду Пуск.

  5. Закройте форму и понаблюдайте, как она исчезает.

    Скоростью исчезновения можно управлять, увеличивая шаг (или уменьшая задержку Sleep).

См. также

Основные понятия

Графика для пользователей Visual Basic 6.0

Ссылки

Общие сведения о Windows Forms

Другие ресурсы

Обновление с версии Visual Basic 6.0