CCreateRectangle类

CCreateRectangle类用于描述交互绘制矩形时对鼠标事件的响应,它实现了ICommand接口。与CCreateLine类中一样,定义了3个局部变量:m_Step记录鼠标左键的单击次数,m_basePos和m_desPos分别记录矩形绘制的起点和终点。

第1次单击鼠标左键时,单击点定义为绘制矩形的起点,同时矩形的终点也初始化为鼠标单击点。

第2次单击鼠标左键时,确定终点的位置。以拖曳方式重绘最后一个橡皮矩形,将它从屏幕上清除。然后用正常模式绘制当前位置的矩形,并将它添加到图元集合类中。绘制完成以后,将m_Step的值归0。

code.vb.net
Public Class CCreateRectangle
    Implements ICommand
    Private m_Step As Integer
    Private m_basePos, m_desPos As PointF
    Public Sub LButtonDown(ByVal g As Graphics, ByVal aPos As PointF) Implements ICommand.LButtonDown
        Dim prePos As New PointF()
        '记录鼠标左键的单击次数
        m_Step += 1
        Select Case m_Step
            Case 1               '第1次单击鼠标左键
                m_basePos = aPos
                m_desPos = aPos
            Case 2
                '重绘并删除前一位置的橡皮矩形
                prePos = m_basePos
                Dim tempRect As New CRectangle(m_basePos, m_desPos)
                tempRect.Draw(g, CGElement.geDrawMode.Drag)
                tempRect = Nothing
                '绘当前位置的矩形
                m_basePos = prePos
                m_desPos = aPos
                Dim newRect As New CRectangle(m_basePos, m_desPos)
                newRect.Draw(g, CGElement.geDrawMode.Normal)
                ges.Add(newRect)
                m_Step = 0
        End Select
    End Sub
End Class

鼠标左键第1次单击以后,移动鼠标时触发窗体的MouseMove事件。这里用MouseMove方法描述移动鼠标时绘图区的响应,它实现了ICommand 接口的MouseMove方法。移动鼠标时,在绘图区绘制橡皮矩形。在绘制过程中,橡皮矩形的起点是不变的,而终点,即起点的对角顶点随鼠标光标位置的变化而变化。使用拖曳绘图模式,不断清除前一位置的橡皮矩形并绘制当前位置的橡皮矩形,然后将当前矩形的终点进行记录,作为绘制下一个橡皮矩形的前一个终点,以便清除该矩形。

code.vb.net
    Public Sub MouseMove(ByVal g As Graphics, ByVal aPos As PointF) Implements ICommand.MouseMove
        Select Case m_Step
            Case 1
                Dim prePos As New PointF()
                Dim curPos As New PointF()
                prePos = m_desPos
                curPos = aPos
                '清除前一位置的橡皮矩形
                Dim tempRect1 As New CRectangle(m_basePos, prePos)
                tempRect1.Draw(g, CGElement.geDrawMode.Drag)
                tempRect1 = Nothing
                '绘当前位置的橡皮矩形
                Dim tempRect2 As New CRectangle(m_basePos, curPos)
                m_desPos = curPos
                tempRect2.Draw(g, CGElement.geDrawMode.Drag)
                tempRect2 = Nothing
        End Select
    End Sub

第1次单击鼠标左 并移动鼠标以后,屏幕上留下一个橡皮矩形,此时如果想取消操作,可以用下面的RButtonDown方法实现,它实现了ICommand接口的RButtonDown方法。该方法在屏幕上清除最后一个橡皮矩形,并将m_Step设置为0。

code.vb.net
    '单击鼠标右键时的绘图行为
    Public Sub RButtonDown(ByVal g As Graphics, ByVal aPos As PointF) Implements ICommand.RButtonDown
        If m_Step = 1 Then
            '清除先前绘制的橡皮矩形
            Dim tempRect As New CRectangle(m_basePos, m_desPos)
            tempRect.Draw(g, CGElement.geDrawMode.Drag)
            tempRect = Nothing
        End If
        m_Step = 0
    End Sub