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