演练:将 Visual Basic 6.0 应用程序升级到当前的 Visual Basic 版本
更新:2007 年 11 月
在本演练中,您将一个 Visual Basic 图形示例应用程序升级到 Visual Basic 2008。除了演示升级过程外,本演练还重点介绍了 Visual Basic 6.0 和 Visual Basic 2008 在图形体系结构上的差异。这也可用作处理应用程序中结构问题的介绍。
此例中的示例应用程序是一个简单的窗体,该窗体包含两个按钮、一个图片框、一个计时器和一个隐藏的图像 (Image) 控件。虽然对于要升级的多数应用程序,它并不是一个典型示例,但它展现了您在升级自己的应用程序时可能会遇到的若干具有挑战性的问题。
说明: |
---|
此演练要求在开发计算机上安装 Visual Basic 6.0。 |
创建 Visual Basic 6.0 应用程序
打开 Visual Basic 6.0。在“文件”菜单上,选择“新建项目”。
在“新建项目”对话框中,选择“标准 EXE”并单击“确定”。
将 PictureBox 控件添加到窗体,调整其大小以填满窗体的大部分空间,并在底部留出一些空间。
将 AutoRedraw 属性设置为 True,将 DrawStyle 属性设置为 0-Solid,并将 FillStyle 属性设置为 0-Solid。
在 PictureBox 控件下面添加两个 CommandButton 控件。
选择第一个 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 中,内部控件不提供通过方法对它们的绘图图面的直接访问(如同在 Visual Basic 6.0 中那样)。所有图形操作均通过 Graphics 类型的特殊对象进行处理。可以通过调用 CreateGraphics() 方法获取 Graphics 对象的一个实例,访问控件的绘图图面。
删除或注释掉原始行 Picture1.Cls()。
修复 Timer1_Timer 错误
在代码编辑器中,选择 Timer1_Tick 过程。
说明: Visual Basic 6.0 Timer 控件的 Timer 事件升级为 Visual Basic 2008 的 Timer 组件的 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 的参数、用于指定 Brush 对象(指定一个 Color 对象)的参数和用于指定绘制文本的起始坐标的参数。
删除或注释掉原始行 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 Events)。
在“方法名称”下拉框中选择 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 延迟)来控制淡出的速度。