逐步解說:將 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 應用程式
開啟 Visual Basic 6.0。在 [檔案] 功能表上,選擇 [新專案]。
在 [新專案] 對話方塊中,選擇 [標準執行檔],然後按一下 [確定]。
在表單上加入 PictureBox 控制項,然後調整其大小,以便能填入大部分表單中,並在底端留下一些空間。
將 AutoRedraw 屬性設定為 True,將 DrawStyle 屬性設定為 0-Solid,並將 FillStyle 屬性設定為 0-Solid。
加入兩個 CommandButton 控制項至 PictureBox 控制項之下。
選取第一個 CommandButton,並將 Name 屬性設定為 ClearPictureBox,然後將 Caption 屬性設定為 Clear。
選取第二個 CommandButton,並將 Name 屬性設定為 ShowImage,然後將 Caption 屬性設定為 Show Image。
加入 Image 控制項至表單,並將 Name 屬性設定為 sourceImage,而將 Visible 屬性設定為 False。
將 Image 控制項的 Picture 屬性設定為任何點陣圖影像。您可以使用 [我的圖片] 資料夾的其中一張圖片。
將 Timer 控制項加入至表單。將 Enabled 屬性設定為 False,並將 Interval 屬性設定為 25。
按兩下這份表單,開啟程式碼編輯器,然後輸入下列程式碼。
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
按下 F5,執行應用程式。按一下按鈕,觀察所產生的行為,然後逐步執行程式碼,留意程式碼的運作情形。
在 [檔案] 功能表上,選擇 [另存新專案]。
在 [另存新檔] 對話方塊中,將表單儲存為 PicForm.frm,然後將專案儲存為 Drawing.vbp。
若要執行升級精靈
開啟 Visual Basic 2008。在 [檔案] 功能表上選擇 [開啟專案]。
在 [開啟專案] 對話方塊中找到 [Drawing.vbp] 檔後,開啟此檔。
即可啟動 [Visual Basic 升級精靈]。精靈的第一頁即解釋了精靈的作用。
按一下 [下一步],即可進入精靈的第二頁。這一頁顯示出升級選項,但目前還沒有選項可用。
按一下 [下一步],即可進入精靈的第三頁。按一下 [下一步] 表示接受新專案的預設位置,您也可以輸入別的位置。預設位置是 Visual Basic 6.0 專案資料夾正下方的新資料夾。
如果系統提示您是否要建立新的資料夾,請選擇 [是]。
在精靈的第四個頁面上,按一下 [下一步] 開始升級過程。
完成升級時,精靈會關閉,[方案總管] 中會出現新的專案。
若要檢視升級結果
在 [方案總管] 中選取 [_UpgradeReport.htm],然後按兩下滑鼠按鈕,即可開啟升級報告。
請注意,這份報告顯示沒有必須解決的全域問題,但顯示 PicForm.vb 雖然沒有警告,卻有六個錯誤。
注意事項:
如果有警告,就會在 [工作清單] 視窗中顯示為 UPGRADE_WARNING 項目。這些警告是針對可能在應用程式的執行階段行為上出現細微差異的程式碼。您只要在 [工作清單] 視窗中按兩下 UPGRADE_WARNING,即可直接進入可能需要修改的程式碼。
在 [新檔名] 資料行中按一下加號,即可展開 [PicForm.vb] 區段。它會詳細列出表單的升級問題。
請注意,這些問題會套用至三個不同的位置:ClearPictureBox_Click 程序、Timer1_Timer 程序和表單配置。您只要按一下 [說明] 連結,就會出現說明主題,針對每個問題做說明。在此情況下的配置問題不需要執行任何動作,如果參閱說明,就會明白問題是因為 Visual Basic 6.0 [PictureBox] 控制項的兩個屬性,未對應為相等的 Visual Basic 2008 屬性所致。
若要修正 ClearPictureBox_Click 錯誤
在 [方案總管] 中選取 [PicForm.vb]。在 [檢視] 功能表上選擇 [程式碼]。
在程式碼編輯器中,選取 ClearPictureBox_Click 程序。
秘訣
UPGRADE_ISSUE 註解會加入至程序中。如果您捲動至註解結尾,只要按一下連結,即可相關的顯示說明主題。升級時,所有問題 (配置問題除外) 都會以程式碼註解的方式加入,包含 UPGRADE_NOTE 註解,解釋升級時所發生的情況,但這些註解不會出現在升級報告中。
將下列程式碼加入至 ClearPictureBox_Click 程序中:
Dim g As Graphics = Picture1.CreateGraphics() g.Clear(Picture1.BackColor) g.Dispose()
原始程序中唯一的錯誤就是 Picture1.Cls() 方法呼叫。在 Visual Basic 2008 中,內建 (Intrinsic) 控制項無法像在 Visual Basic 6.0 中一樣,以方法提供直接存取本身的繪圖介面。所有圖形作業都是以 Graphics 型別的特殊物件進行處理。您只要呼叫 CreateGraphics() 方法,取得 Graphics 物件的執行個體,即可存取控制項的繪圖介面。
將原始行 Picture1.Cls() 刪除或標記為註解。
若要修正 Timer1_Timer 錯誤
在程式碼編輯器中,選取 Timer1_Tick 程序。
注意事項:
Visual Basic 6.0 之 Timer 控制項的 Timer 事件會升級為 Visual Basic 2008Timer 元件的 Tick 事件。升級報告顯示舊的事件名稱,程式碼編輯器使用新的事件名稱。
在函式的開頭,加入下列程式碼:
Dim g As Graphics = Picture1.CreateGraphics()
就如前述程序,此處錯誤是從缺少 Graphics 物件開始。
尋找第一個 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 物件,以及描繪文字的起始座標。
將原始行 Picture1.Print("Visual Basic ROCKS!") 刪除或標記為註解。
尋找下一個 UPGRADE_ISSUE,也就是 Picture1.Cls()。請將程式碼代換如下:
g.Clear(Picture1.BackColor)
尋找最後一個 UPGRADE_ISSUE,也就是 Picture1.PaintPicture。加入以下程式碼:
g.DrawImage(sourceImage.Image, CSng(LeftPos * Picture1.Size.Width), _ 0)
在此情況下,Graphics 類別的 DrawImage 方法會取代 PaintPicture 方法。
將原始行 Picture1.PaintPicture(sourceImage, LeftPos * VB6.PixelsToTwipsX(Picture1.Width), 0) 刪除或標記為註解。
在程序尾端,加入下列程式碼:
g.Dispose()
必須使用 Dispose 方法來釋出 Graphics 物件的相關記憶體資源。
若要測試應用程式
在 [偵錯] 功能表上選擇 [啟動]。
注意事項:
如果系統提示您儲存方案檔案,請按一下 [儲存] 以儲存檔案並執行應用程式。
按一下 [ShowImage] 按鈕。
您會發現繪圖時,影像會閃動。這是因為螢幕繪製更新影像時,會先清除整個區域。
進一步修改應用程式
在這裡,解決方案是只繪製螢幕上必要的部分,而不繪製 Graphics 物件所表示的整個區域。您大概也要確定在螢幕上繪製影像時,上次呼叫 DrawImage() 後殘留的任何像素,已經都以背景色彩遮蔽。影像是從右往左移,因此只要蓋掉圖片右側的其他像素即可。
若要修正螢幕閃動問題
在 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))
使用 FillRectangle 方法取代 Clear 方法,以背景色彩遮蔽目前正在繪製之影像右側的任何殘餘像素。但您必須先用程式碼的前三行,計算矩形左端的座標。
在 [偵錯] 功能表上選擇 [啟動]。
按一下 [ShowImage] 按鈕。
您會發現影像移動時,不再閃動。
此外,還要解決另外一個問題。您可能已經注意到,顯示於 PictureBox 控制項中的訊息字型比原始版本小。這是因為在 Visual Basic 6.0 應用程式中,PictureBox 控制項的 Font 屬性在設計階段是設定為 Arial Bold 16。Visual Basic 2008 的 PictureBox 控制項沒有 Font 屬性,而是使用表單的預設字型 (Me.Font)。您可以透過宣告新的 Font 物件,修正這種情況。
若要修復字型
在 Timer1_Tick 程序中,加入下列宣告:
Dim f As System.Drawing.Font = New System.Drawing.Font("Arial", _ 16, FontStyle.Bold)
在對 g.DrawString 的呼叫中,將字型參數從 Me.Font 變更為 f。
在 [偵錯] 功能表上選擇 [啟動]。
按一下 [ShowImage] 按鈕。
現在文字以正確的字型顯示。
現在應用程式又回到原始 Visual Basic 6.0 應用程式的同位,您必須加入一些程式碼來加強應用程式。如果不需要利用 Visual Basic 2008 的好處,當然也就沒有必要升級應用程式。
您的下一個步驟是要加入功能,讓表單在關閉時慢慢淡出。
![]() |
---|
256 色的顯示看不出淡出效果,您必須將色彩深度設定為高彩或全彩,才能檢視結果。Opacity 屬性只適用於 Windows XP。 |
若要加強應用程式
在程式碼編輯器中,選取 [類別名稱] 下拉式清單,再選擇 [(Form1 事件)]。
在 [方法名稱] 下拉式方塊中,選取 FormClosing 事件。
在 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
在 [偵錯] 功能表上選擇 [啟動]。
關閉表單,同時請注意該表單是如何淡出的。
您可以透過增加步驟的大小 (或是減少 Sleep 延遲),控制淡出的速度。