2016-04-15 14 views
0

グラフィックスコンポーネントが変換された後でカーソル位置をズームするには?
どのテスト矩形にもズームできます。VB.NetでGraphicsトランスフォーム後のマウス位置をズームする

パンは、マウスの中央ボタンで行います。
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 

答えて

0

第1位。知るべきことは、マウスの位置が制御座標にあることです。これは、scrollイベントのEventArgumentsの一部です。その場所をフィールドに保存します。

第2に、負の保存された場所でTranslateTransformを適用して、ズーム位置を0/0に移動してからScaleTransformを適用する必要があります。

3番目のTranslateTransformで元の場所に戻って画像を移動します。保存されたマウスの位置(ネゲートされていない)で表示されます。

トマス