연습: Visual Basic 6.0 응용 프로그램을 Visual Basic 현재 버전으로 업그레이드

업데이트: 2007년 11월

이 연습에서는 Visual Basic 그래픽 샘플 응용 프로그램을 Visual Basic 2008로 업그레이드합니다. 이 연습에서는 업그레이드 프로세스 외에도 Visual Basic 6.0과 Visual Basic 2008 간의 그래픽 아키텍처 차이점을 보여 줍니다. 이 연습을 통해 응용 프로그램에서 아키텍처 문제를 다루는 방법에 대해서도 배우게 될 것입니다.

이 연습에서 사용할 샘플 응용 프로그램은 두 개의 단추, 한 개의 그림 상자 및 숨겨진 이미지 컨트롤을 가진 간단한 폼입니다. 일반적으로 업그레이드하는 응용 프로그램은 이러한 폼은 아니지만 이 폼을 통해 자신의 응용 프로그램을 업그레이드할 때 발생할 수도 있는 여러 가지 문제점에 대해 배울 수 있습니다.

참고:

이 연습을 진행하려면 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. Image 컨트롤의 Picture 속성을 비트맵 이미지로 설정합니다. 내 그림 폴더에서 그림 중 하나를 사용할 수 있습니다.

  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의 경우 여섯 개의 오류만 있고 경고는 없습니다.

    참고:

    경고가 있으면 작업 목록 창에 UPGRADE_WARNING 항목으로 나타납니다. 경고는 응용 프로그램의 런타임 동작에서 미세한 차이점이 발생할 수도 있는 코드에 대해 발생합니다. 작업 목록 창에서 UPGRADE_WARNING을 두 번 클릭하면 수정해야 하는 코드가 있는 위치로 즉시 이동됩니다.

  2. 새 파일 이름 열에서 더하기 기호를 클릭하여 PicForm.vb 섹션을 확장합니다. 그러면 폼에 대한 업그레이드 문제점의 자세한 목록이 표시됩니다.

    문제점은 세 가지의 다른 위치, 즉 ClearPictureBox_Click 프로시저, Timer1_Timer 프로시저 및 폼 레이아웃에 적용됩니다. 설명 링크를 클릭하면 각 문제점에 대해 설명하는 도움말 항목이 표시됩니다. 이 경우 레이아웃 문제점에 대해서는 조치를 취하지 않아도 됩니다. 도움말을 확인해보면 이 문제점은 해당하는 Visual Basic 2008 속성에 매핑하지 않는 Visual Basic 6.0 PictureBox 컨트롤의 두 가지 속성에 관한 것임을 알 수 있습니다.

ClearPictureBox_Click 오류를 해결하려면

  1. 솔루션 탐색기에서 PicForm.vb를 선택합니다. 보기 메뉴에서 코드를 선택합니다.

  2. 코드 편집기에서 ClearPictureBox_Click 프로시저를 선택합니다.

    팁:

    이 프로시저에는 UPGRADE_ISSUE 주석이 추가되어 있습니다. 주석의 끝 부분까지 스크롤하여 링크를 클릭하면 관련 도움말 항목을 볼 수 있습니다. 레이아웃 문제점을 제외하고, 업그레이드하는 동안 발생한 문제점을 설명하는 UPGRADE_NOTE 주석을 비롯한 모든 문제점이 코드 주석으로 추가됩니다. 이러한 문제점은 업그레이드 보고서에 나타나지 않습니다.

  3. ClearPictureBox_Click 프로시저에 다음 코드를 추가합니다.

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

    원래 프로시저에는 Picture1.Cls() 메서드 호출 부분에만 오류가 있습니다. Visual Basic 6.0과 달리 Visual Basic 2008의 내장 컨트롤에서는 메서드를 통해 그리기 화면에 직접 액세스할 수 없습니다. 모든 그래픽 작업은 Graphics 형식인 특수한 개체를 사용하여 처리됩니다. CreateGraphics() 메서드를 호출하여 Graphics 개체의 인스턴스를 얻음으로써 컨트롤의 그리기 화면에 액세스할 수 있습니다.

  4. 원래 코드에서 줄 Picture1.Cls()를 삭제하거나 주석으로 처리합니다.

Timer1_Timer 오류를 해결하려면

  1. 코드 편집기에서 Timer1_Tick 프로시저를 선택합니다.

    참고:

    Visual Basic 6.0에서 사용하던 Timer 컨트롤의 Timer 이벤트는 Visual Basic 2008에서 Timer 구성 요소의 Tick 이벤트로 업그레이드되었습니다. 업그레이드 보고서에는 이전의 이벤트 이름이 나타나고 코드 편집기에서는 새 이벤트 이름을 사용합니다.

  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)
    

    Graphics 개체의 DrawString 메서드는 Visual Basic 6.0의 Print 메서드를 대체합니다. Print 메서드에는 인수가 Text 하나뿐이지만 DrawString 메서드에는 Font를 지정하는 인수, Color 개체를 지정하는 Brush 개체 및 텍스트를 그릴 지점의 시작 좌표 같은 추가 인수가 있습니다.

  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)
    

    이 경우 Graphics 클래스의 DrawImage 메서드는 PaintPicture 메서드를 대체합니다.

  7. 원래 코드에서 줄 Picture1.PaintPicture(sourceImage, LeftPos * VB6.PixelsToTwipsX(Picture1.Width), 0)를 삭제하거나 주석으로 처리합니다.

  8. 프로시저의 끝 부분에 아래와 같은 코드를 추가합니다.

    g.Dispose()
    

    Dispose 메서드는 Graphics 개체와 관련된 메모리 리소스를 해제하는 데 필요합니다.

응용 프로그램을 테스트하려면

  1. 디버그 메뉴에서 시작을 선택합니다.

    참고:

    솔루션 파일을 저장하라는 메시지가 나타나면 저장을 클릭하여 파일을 저장하고 응용 프로그램을 실행합니다.

  2. 이미지 보기 단추를 클릭합니다.

    화면에 그릴 때 이미지가 깜빡이는 것을 알 수 있습니다. 업데이트된 각 이미지를 화면에 그리기 전에 전체 영역을 지우기 때문에 이러한 현상이 발생합니다.

응용 프로그램 추가 수정

이 문제를 해결하려면 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. 이미지 보기 단추를 클릭합니다.

    이제 이미지가 이동할 때 깜빡거리지 않습니다.

해결해야 할 문제가 하나 더 있습니다. PictureBox 컨트롤에 표시된 메시지의 글꼴이 원래의 버전보다 더 작게 표시되는 것을 볼 수 있습니다. 그 이유는 Visual Basic 6.0 응용 프로그램에서 디자인 타임에 PictureBox 컨트롤의 Font 속성이 굴림 굵게 16으로 설정되었기 때문입니다. Visual Basic 2008에서는 PictureBox 컨트롤에 Font 속성이 없습니다. 대신 폼의 기본 글꼴(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. 이미지 보기 단추를 클릭합니다.

    이제 텍스트가 정확한 글꼴로 표시됩니다.

응용 프로그램이 원래의 Visual Basic 6.0 응용 프로그램과 동일해졌으므로 이제 기능을 향상시키기 위해 약간의 코드를 추가합니다. 즉, Visual Basic 2008의 기능을 활용하지 않으려면 응용 프로그램을 업그레이드하는 의미가 없습니다.

다음 단계에서는 폼을 닫을 때 폼이 점차 희미해지며 사라지는 기능을 추가합니다.

참고:

256색 디스플레이에서는 희미해지는 효과를 볼 수 없습니다. 결과를 제대로 보려면 색상 수를 하이 컬러 또는 트루 컬러로 설정해야 합니다. 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에서 업그레이드