VB6转VB.NET:PictureBox.Scale与Line方法替代方案问询
VB6转VB.NET:DrawMap函数转换方案
核心问题替换说明
VB6的PictureBox.Scale()和Line()方法在VB.NET中已被GDI+替代,以下是对应功能的直接转换方案,完全贴合原代码逻辑:
转换后的VB.NET代码
Public Sub DrawMap(picMap As PictureBox, x1 As Integer, x2 As Integer, y1 As Integer, y2 As Integer) ' 假设x1st、y1st、arrDrawDie、gDelim为全局/模块级变量 Dim i As Integer Dim temp As String() Dim lColor As Color ' 处理主地图绘制 Using gMap As Graphics = picMap.CreateGraphics() gMap.Clear(picMap.BackColor) ' 模拟VB6 Scale(x1-5, y2+5)-(x2+5, y1-5)的坐标系统 Dim mapWidth As Single = (x2 + 5) - (x1 - 5) Dim mapHeight As Single = (y1 - 5) - (y2 + 5) ' Y轴反转,计算上边界减下边界 Dim scaleX As Single = picMap.ClientSize.Width / mapWidth Dim scaleY As Single = picMap.ClientSize.Height / mapHeight ' 平移+缩放实现自定义坐标,Y轴反转 gMap.TranslateTransform(-(x1 - 5), -(y2 + 5)) gMap.ScaleTransform(scaleX, -scaleY) ' 循环绘制所有元素 For i = arrDrawDie.GetLowerBound(0) To arrDrawDie.GetUpperBound(0) temp = Split(CStr(arrDrawDie(i)), gDelim) ' 根据标记值设置颜色 Select Case temp(temp.GetUpperBound(0)) Case "0" lColor = Color.FromArgb(&HC0, &HFF, &HC0) ' 对应VB6 &HC0FFC0 Case "-2" lColor = Color.FromKnownColor(KnownColor.ButtonFace) ' 对应VB6 &H8000000A Case Else lColor = Color.FromArgb(&HFF, &H80, &H80) ' 对应VB6 &H8080FF End Select ' 绘制填充矩形,替代VB6 Line ... BF Dim tempX As Single = CSng(temp(0)) Dim tempY As Single = CSng(temp(1)) Dim rect As New RectangleF(tempX - 0.4F, tempY - 0.4F, 0.8F, 0.8F) Using brush As New SolidBrush(lColor) gMap.FillRectangle(brush, rect) End Using ' 绘制到小预览框(符合范围时) If tempX > (x1st - 4) AndAlso tempY > (y1st - 4) AndAlso tempX < (x1st + 4) AndAlso tempY < (y1st + 4) Then Using gFirst As Graphics = My.Forms.frmMain.picFirst.CreateGraphics() gFirst.Clear(My.Forms.frmMain.picFirst.BackColor) ' 模拟VB6 Scale(x1st-4, y1st+4)-(x1st+4, y1st-4) Dim firstWidth As Single = (x1st + 4) - (x1st - 4) Dim firstHeight As Single = (y1st - 4) - (y1st + 4) Dim firstScaleX As Single = My.Forms.frmMain.picFirst.ClientSize.Width / firstWidth Dim firstScaleY As Single = My.Forms.frmMain.picFirst.ClientSize.Height / firstHeight gFirst.TranslateTransform(-(x1st - 4), -(y1st + 4)) gFirst.ScaleTransform(firstScaleX, -firstScaleY) Using firstBrush As New SolidBrush(Color.FromArgb(&HC0, &HFF, &HC0)) gFirst.FillRectangle(firstBrush, rect) End Using End Using End If Next i ' 绘制蓝色标记点 Dim blueRect As New RectangleF(x1st - 0.4F, y1st - 0.4F, 0.8F, 0.8F) Using blueBrush As New SolidBrush(Color.Blue) gMap.FillRectangle(blueBrush, blueRect) End Using End Using ' 绘制小预览框的蓝色标记点 Using gFirst As Graphics = My.Forms.frmMain.picFirst.CreateGraphics() Dim firstWidth As Single = (x1st + 4) - (x1st - 4) Dim firstHeight As Single = (y1st - 4) - (y1st + 4) Dim firstScaleX As Single = My.Forms.frmMain.picFirst.ClientSize.Width / firstWidth Dim firstScaleY As Single = My.Forms.frmMain.picFirst.ClientSize.Height / firstHeight gFirst.TranslateTransform(-(x1st - 4), -(y1st + 4)) gFirst.ScaleTransform(firstScaleX, -firstScaleY) Dim blueRect As New RectangleF(x1st - 0.4F, y1st - 0.4F, 0.8F, 0.8F) Using blueBrush As New SolidBrush(Color.Blue) gFirst.FillRectangle(blueBrush, blueRect) End Using End Using ' 更新标签文本 My.Forms.frmMain.lblFirst.Text = $"X: {x1st.ToString("000")} Y: {y1st.ToString("000")}" End Sub
关键转换细节
替代
Scale()方法
VB6的自定义坐标系统通过GDI+的TranslateTransform(平移)和ScaleTransform(缩放)实现,其中Y轴设置负缩放因子,模拟VB6中Y轴向上递增的逻辑。替代
Line ... BF方法
VB6的填充矩形功能用Graphics.FillRectangle配合SolidBrush实现,直接传入矩形的左上角坐标、宽度和高度(原代码中宽高均为0.8)。颜色转换
- 普通数值颜色:用
Color.FromArgb(R, G, B)直接转换VB6的RRGGBB格式数值 - 系统颜色:用
Color.FromKnownColor替代VB6的系统颜色常量(如&H8000000A对应KnownColor.ButtonFace)
- 普通数值颜色:用
优化建议
更规范的做法是将绘制逻辑放到PictureBox的Paint事件中,避免CreateGraphics导致的内容丢失问题:Private Sub picMap_Paint(sender As Object, e As PaintEventArgs) Handles picMap.Paint DrawMapToGraphics(e.Graphics, picMap.ClientSize, x1, x2, y1, y2) End Sub Private Sub DrawMapToGraphics(g As Graphics, clientSize As Size, x1 As Integer, x2 As Integer, y1 As Integer, y2 As Integer) ' 这里放入坐标变换和绘制代码,无需CreateGraphics End Sub
内容的提问来源于stack exchange,提问作者trankilo
相关产品推荐
相关产品推荐

