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

时间:2016-04-15 07:09:20

标签: vb.net gdi+

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

使用鼠标中键完成平移 MouseWheel事件处理缩放 忽略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

1 个答案:

答案 0 :(得分:0)

第一。要知道的是鼠标位置在控制坐标中的位置。它是scroll事件中EventArguments的一部分。将该位置保存到字段中。

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

第三个将图片移回另一个TranslateTransform的原始位置。现在用保存的鼠标位置(没有否定)。

托马斯