CRectangle类

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