|
|
Title | Let the user move and modify multiple polygons with grab handles |
Keywords | polygons, drag, grab handles, object-oriented design, classes, objects |
Categories | Graphics |
|
|
Each polygon is represented by a DraggablePolygon object. When the drawing PictureBox receives a MouseDown
event, it calls each DraggablePolygon's IsOverVertex function to see if the point is over a vertex. If it is,
the event handler makes the polygon move its vertex. More on that in a moment.
If the point is not over any vertex, the event handler calls each DraggablePolygon's IsOverEdge function to
see if the point is over a polygon edge. If it is,
the event handler makes the polygon move itself.
The DraggablePolygon's DragVertex routine is shown in the following code. It sets the variable m_DragVertexCanvas
to the PictureBox on which the polygon lies. That variable is declared WithEvents so the DraggablePolygon object
receives the PictureBox's events.
When the DraggablePolygon receives the m_DragVertexCanvas_MouseMove event, the user has moved the mouse over
the canvas. The event handler updates the position of the vertex being dragged and redraws the polygon.
All drawing during the drag is in invert mode so the program can erase each temporary polygon.
When the DraggablePolygon receives the m_DragVertexCanvas_MouseUp event, the user has released the mouse.
The object sets the DrawMode for m_DragVertexCanvas back to its normal setting and then sets
m_DragVertexCanvas to Nothing so it no longer receives any PictureBox events. It raises the VertexMoved
event so the main program can take action. In particular, the main program redraws all of the polygons
with the vertex moved.
|
|
' Used to get events while dragging a vertex.
Private WithEvents m_DragVertexCanvas As PictureBox
' Draw the selected vertex.
Public Sub DragVertex(ByVal canvas As PictureBox, ByVal X _
As Long, ByVal Y As Long)
' Set the vertex drag PictureBox so we can
' catch its mouse events.
Set m_DragVertexCanvas = canvas
m_DragVertexCanvas.DrawMode = vbInvert
' Redraw in invert mode.
Draw m_DragVertexCanvas
End Sub
' Continue dragging the vertex.
Private Sub m_DragVertexCanvas_MouseMove(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
' Erase the previous invert mode image.
Draw m_DragVertexCanvas
' Move the handle.
With m_Vertices(m_OverPoint)
.X = X
.Y = Y
End With
' Redraw.
Draw m_DragVertexCanvas
End Sub
' Stop dragging the vertex.
Private Sub m_DragVertexCanvas_MouseUp(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
m_DragVertexCanvas.DrawMode = vbCopyPen
Set m_DragVertexCanvas = Nothing
RaiseEvent VertexMoved
End Sub
|
|
Moving a polygon is similar. The main program calls the polygon's DragPolygon method to start the drag.
That routine saves a reference to the drawing surface in a variable declared WithEvents. It receives mouse
events and moves the polygon accordingly. When the user releases the mouse, the object raises the
PolygonMoved event.
See the code for further details.
|
|
|
|
|
|