You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键转换细节

  1. 替代Scale()方法
    VB6的自定义坐标系统通过GDI+的TranslateTransform(平移)和ScaleTransform(缩放)实现,其中Y轴设置负缩放因子,模拟VB6中Y轴向上递增的逻辑。

  2. 替代Line ... BF方法
    VB6的填充矩形功能用Graphics.FillRectangle配合SolidBrush实现,直接传入矩形的左上角坐标、宽度和高度(原代码中宽高均为0.8)。

  3. 颜色转换

    • 普通数值颜色:用Color.FromArgb(R, G, B)直接转换VB6的RRGGBB格式数值
    • 系统颜色:用Color.FromKnownColor替代VB6的系统颜色常量(如&H8000000A对应KnownColor.ButtonFace)
  4. 优化建议
    更规范的做法是将绘制逻辑放到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:07:01