Home
Search
 
What's New
Index
Books
Links
Q & A
Newsletter
Banners
 
Feedback
Tip Jar
 
C# Helper...
 
XML RSS Feed
Follow VBHelper on Twitter
 
 
 
MSDN Visual Basic Community
 
 
 
 
 
TitleLet the user modify a polygon with grab handles in VB .NET
Keywordspolygon, grab handles, draw, drag
CategoriesGraphics, VB.NET
 
Keep the list of polygon vertices in arrays. In the MouseDown event handler, search the vertices to see if the point is close to a vertex. If it is, start dragging.
 
' The grab handle we are dragging. This is 
' -1 when we are not dragging any handle.
Private m_DraggingHandle As Integer = -1

' The data points.
Private m_Points() As Point

Private Const HANDLE_WIDTH As Integer = 6
Private Const HANDLE_HALF_WIDTH As Integer = HANDLE_WIDTH \ _
    2

' Create some initial point data.
Private Sub Form1_Load(ByVal sender As Object, ByVal e As _
    System.EventArgs) Handles MyBase.Load
    ' Make room.
    ReDim m_Points(4)

    ' Set initial points.
    m_Points(0).X = 67 : m_Points(0).Y = 189
    m_Points(1).X = 62 : m_Points(1).Y = 111
    m_Points(2).X = 123 : m_Points(2).Y = 100
    m_Points(3).X = 190 : m_Points(3).Y = 183
    m_Points(4).X = 130 : m_Points(4).Y = 214
End Sub

' Draw the polygon.
Private Sub DrawPolygon(ByVal gr As Graphics)
    gr.Clear(picCanvas.BackColor)
    gr.DrawPolygon(Pens.Black, m_Points)

    ' Draw grab handles as white squares with
    ' black edges.
    Dim rectangles() As Rectangle
    ReDim rectangles(m_Points.GetUpperBound(0))
    For i As Integer = 0 To m_Points.GetUpperBound(0)
        With rectangles(i)
            .X = m_Points(i).X - HANDLE_HALF_WIDTH
            .Y = m_Points(i).Y - HANDLE_HALF_WIDTH
            .Width = HANDLE_WIDTH
            .Height = HANDLE_WIDTH
        End With
    Next i
    gr.FillRectangles(Brushes.White, rectangles)
    gr.DrawRectangles(Pens.Black, rectangles)
End Sub

Private Sub picCanvas_Paint(ByVal sender As Object, ByVal e _
    As System.Windows.Forms.PaintEventArgs) Handles _
    picCanvas.Paint
    DrawPolygon(e.Graphics)
End Sub

' See if we are over a grab handle.
Private Sub picCanvas_MouseDown(ByVal sender As Object, _
    ByVal e As System.Windows.Forms.MouseEventArgs) Handles _
    picCanvas.MouseDown
    Dim dx As Single
    Dim dy As Single

    For i As Integer = 0 To m_Points.GetUpperBound(0)
        If Abs(m_Points(i).X - e.X) < HANDLE_HALF_WIDTH And _
            _
           Abs(m_Points(i).Y - e.Y) < HANDLE_HALF_WIDTH _
        Then
            ' We are over this grab handle.
            ' Start dragging.
            m_DraggingHandle = i
            picCanvas.Cursor = Cursors.Cross
            Exit For
        End If
    Next i
End Sub

' Move the drag handle.
Private Sub picCanvas_MouseMove(ByVal sender As Object, _
    ByVal e As System.Windows.Forms.MouseEventArgs) Handles _
    picCanvas.MouseMove
    ' Do nothing if we are not dragging.
    If m_DraggingHandle = -1 Then Exit Sub

    ' Move the handle.
    m_Points(m_DraggingHandle).X = e.X
    m_Points(m_DraggingHandle).Y = e.Y

    ' Redraw.
    DrawPolygon(picCanvas.CreateGraphics())
End Sub

' Stop dragging.
Private Sub picCanvas_MouseUp(ByVal sender As Object, ByVal _
    e As System.Windows.Forms.MouseEventArgs) Handles _
    picCanvas.MouseUp
    picCanvas.Cursor = Cursors.Default
    m_DraggingHandle = -1
End Sub
 
For more information on graphics programming in Visual Basic 6, see my book Visual Basic Graphics Programming.
 
 
Copyright © 1997-2010 Rocky Mountain Computer Consulting, Inc.   All rights reserved.
  Updated