在VB.Net中,缩放到图形转换后的鼠标位置



图形组件转换后,如何缩放到光标位置
我希望能够缩放到任何测试矩形。

平移是用鼠标中键完成的
鼠标滚轮事件处理缩放
忽略DrawGrid方法,它只是为了获得一些视觉参考。

Public Class Diagram
Dim renderOrigin As New Point
Dim zoom As Single = 1.0F
Dim startPoint As New Point
Dim isDragging As Boolean = False
Dim gridSpacing As Integer = 50
Dim testRects() As Rectangle = New Rectangle() {New Rectangle(-150, -150, 70, 25), _
                                                New Rectangle(-10, -5, 70, 25), _
                                                New Rectangle(100, 8, 70, 25), _
                                                New Rectangle(300, 80, 70, 25)}
Sub New()
    SetStyle(ControlStyles.ResizeRedraw, True)
    SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
    SetStyle(ControlStyles.AllPaintingInWmPaint, True)
    ' This call is required by the designer.
    InitializeComponent()
    ' Add any initialization after the InitializeComponent() call.
End Sub
Protected Overrides Sub OnPaint(e As PaintEventArgs)
    Dim g As Graphics = e.Graphics
    g.TranslateTransform(renderOrigin.X, renderOrigin.Y)
    g.ScaleTransform(zoom, zoom)
    drawGrid(g)
    g.FillRectangles(Brushes.Green, testRects.ToArray)
End Sub

Private Sub drawGrid(ByRef g As Graphics)
    If zoom < 0.6 Then
        Exit Sub
    End If
    Dim oX As Integer = renderOrigin.X
    Dim oY As Integer = renderOrigin.Y
    Dim maxStepX As Integer = Math.Ceiling((Width - oX) / gridSpacing) / zoom
    Dim maxStepY As Integer = Math.Ceiling((Height - oY) / gridSpacing) / zoom
    Dim minStepX As Integer = Math.Floor((oX * -1) / gridSpacing) / zoom
    Dim minStepY As Integer = Math.Floor((oY * -1) / gridSpacing) / zoom

    For x = minStepX To maxStepX
        For y = minStepY To maxStepY
            g.DrawLine(Pens.Black, x * gridSpacing, gridSpacing * y, (x + 1) * gridSpacing, gridSpacing * y)
            g.DrawLine(Pens.Black, x * gridSpacing, gridSpacing * y, x * gridSpacing, (y + 1) * gridSpacing)
        Next
    Next
End Sub
Private Sub Diagram_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown
    If e.Button = Windows.Forms.MouseButtons.Middle Then
        startPoint = New Point(e.X - renderOrigin.X, e.Y - renderOrigin.Y)
        isDragging = True
    End If
End Sub
Private Sub Diagram_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
    If isDragging Then
        renderOrigin = New Point(e.X - startPoint.X, e.Y - startPoint.Y)
        Invalidate()
    End If

End Sub
Private Sub Diagram_MouseUp(sender As Object, e As MouseEventArgs) Handles Me.MouseUp
    isDragging = False
End Sub
Private Sub Diagram_MouseWheel(sender As Object, e As MouseEventArgs) Handles Me.MouseWheel
    Dim i As Single = (e.Delta / Math.Abs(e.Delta)) / 100
    zoom += i
    If zoom < 0.1 Then zoom = 0.1
    If zoom > 1.0 Then zoom = 1.0
    renderOrigin = New Point(e.X - e.X * zoom, e.Y - e.Y * zoom)
    Invalidate()
End Sub

End Class

1st。需要知道的是鼠标在控制坐标系中的位置。它是滚动事件中EventArguments的一部分。将该位置保存到字段中。

第二,你必须应用TranslateTransform和否定的保存位置,将缩放位置移动到0/0,然后应用ScaleTransform。

第三步,通过另一个TranslateTransform将图片移回其原始位置。现在使用保存的鼠标位置(未否定)。

Thomas

最新更新