CRectangle类从CGElement类派生。它除了继承CGElement类的Color, Style和 Width等属性和DrawSettings方法,还要添加绘制矩形时的起点和终点属性,并根据这两个点的坐标得到矩形左上角点和右下角点的坐标,它们是只读的。需要说明的是,用鼠标交互绘制矩形时,可以从左上角向右下角绘,也可以从右下角向左上角绘,所以起点、终点和左上角、右下角的顶点不一定是相同的。根据起点和终点的坐标,用两者横坐标的小值和纵坐标的大值构造左上角点,用两者横坐标的大值和纵坐标的小值构造右下角点。其间用到了求最大值和最小值的函数,在VB.NET程序中需要导入System.Math名字空间。然后重写基类的Draw方法,调用Win32API类的Rectangle方法绘制矩形。
这里,仍然提供了3个构造函数,一个为无参构造函数,另一个用给定的两个点作为创建矩形时的起点和终点构造矩形,第3个用已知的矩形构造矩形。用构造函数创建CRectangle类的实例时,用Iit方法进行初始化,将起点和终点的位置初始化为坐标原点。
code.vb.net
Imports System.Math
Public Class CRectangle
Inherits CGElement
Private m_basePos,m_desPos As Point
'绘矩形时的起点
Public Property basePos() As PointF
Get
Return m_basePos
End Get
Set(ByVal Value As PointF)
m_basePos = Value
End Set
End Property
''绘矩形时的终点
Public Property desPos() As PointF
Get
Return m_ desPos
End Get
Set(ByVal Value As PointF)
m_desPos =Value
End Set
End Property
'矩形的左上角点
Public ReadOnly Property LTO As PointF
Get
Return(New PointF(Min(m_basePos.X,m_desPos.X),
Max(m_basePos.Y,m_desPos.Y))
End Get
End Property
'矩形的右下角点
Public ReadOnly Property RBO As PointF
Get
Retum(New PointF(Max(m_basePos.X,m_desPos.X),
Min(m_basePos.Y,m_desPos.Y))
End Get
End Property
'无参构造函数
Public Sub New()
Init()
End Sub"
'构造函数,用已知的两点构造矩形
Public Sub New(ByVal pBase As PointF, ByVal pDes As PointF)
Init()
m_basePos = pBase
m_desPos = pDes
End Sub
'构造函数,用已知的矩形构造矩形
Public Sub New(By Val arectangle As CRectangle)
m_basePos = arectangle.basePos
m_desPos = arectangle.desPos
End Sub
'初始化矩形
Private Shadows Sub Init()
MyBase.Init()
With m_basePos
X=0
Y=0
End With
m_desPos = m_basePos
End Sub
End Class
通过重写基类的Draw 方法来绘制矩形。绘矩形时,需要首先将矩形的起点和终点坐标转换为页面坐标,然后求取页面坐标下矩形左上角和右下角的坐标。进行绘图设置以后,用Rectangle函数绘制矩形。需要注意的是,因为矩形是一个封闭的图形,用API函数 Rectangle绘图之前还需要将一把空刷子选入绘图环境。
code.vb.net
'绘矩形
Public Overrides Sub Draw(By Val g As Graphics, ByVal aDrawMode As geDrawMode)
Dim aPen, oldP As Long
'将绘矩形时的起点和终点坐标转换为页面坐标
Dim eb As PointF = WorldtoPage(m_basePos)
Dim ed As PointF = WorldtoPage(m_desPos
Dim minX, minY As Single
Dim maxX, maxY As Single
minX= Min(eb.X,ed.X)
minY= Min(e.Y,e.Y)
maxX=Max(eb.X,ed.X)
maxY= Max(eb.Y, ed.Y)
'获取绘图环境的句柄
Dim hdc As IntPtr
hdc =g.GetHdc()
'设置画笔参数
Dim penPara As Integer( = DrawSettings(hdc, aDrawMode)
'创建画笔
aPen = Win32API.CreatePen(penPara(0),penPara(1),penPara(2))
'把画笔选入绘图环境,并返回原来的画笔
oldP = Win32APL.SelectObject(hdc,aPen)
'把空刷子选入绘图环境
Win32API.SelectObject(hdc,Win32APL.GetStockObject(5)
'绘制矩形
Win32API.Rectangle(hdc, minX, maxY, maxX, minY)
'把原来的画笔选入绘图环境"
Win32APL.SelectObject(hdc, oldP)
'删除新创建的画笔
Win32API.DeleteObject(aPen)
'释放绘图环境句柄
g.ReleaseHdc(hdc)
End Sub