当前位置: 首页 > 文档资料 > Gdip 编程基础 >

1.4 几何辅助类

优质
小牛编辑
136浏览
2023-12-01

与 GDI 的类似,在 GDI+ API 中也定义了许多绘图的辅助类,常用的有点、大小和矩形 等几何类。它们都是没有基类的独立类,被定义在头文件 GdiplusTypes.h 中。与 GDI 不同 的是,在 GDI+中新增加了浮点型的几何类。

浮点数版的几何对象和绘图方法,是 GDI+新增的功能,这些在各种工程技术领域都非 常有用。因为一般的实际图形设计,都是基于实数坐标的。包括机械(../轮船/飞机 等)、建筑(../道路/堤坝等)和图形动画设计(../../轨迹等)等设 计,都必须使用浮点参数和坐标系。

下面对 GDI+的几何辅助类,逐个进行简单的介绍。

1.4.1 Point[F](点)

GDI+中,有两种类型的点:整数点(对应于 Point 类,与 GDI 的 MFC 类 CPoint 类似) 和浮点数点(对应于 PointF 类),下面分别加以介绍。

(1)整数点类 Point

class Point 
{ 
public:
    Point() {X = Y = 0;}
    Point(const Point &point) {X = point.X; Y = point.Y;} 
    Point(const Size &size) {X = size.Width; Y = size. Height;} 
    Point(INT x, INT y) {X = x; Y = y;}
    Point operator+(const Point& point) const {return Point(X + point.X, Y + point.Y);}
    Point operator-(const Point& point) const {return Point(X - point.X, Y - point.Y);} 
    BOOL Equals(const Point& point) {return (X == point.X) && (Y == point.Y);}
public:
    INT X; INT Y; // 大写 X、Y
};

其中:typedef int INT; 为 4 字节有符号整数(windef.h)。 注意,GDI+的点与 GDI 的区别:POINT 和 CPoint 采用小写的 x、y。

(2)浮点数点类 PointF

class PointF 
{ 
public:
    PointF() {X = Y = 0.0f;}
    PointF(REAL x, REAL y) {X = x; Y = y;}
    ... // 与整数版的类似
public:
    REAL X; REAL Y;
};

其中:typedef float REAL; 为 4 字节浮点数(GdiplusTypes.h)。

1.4.2 Size[F](大小)

GDI+中,也有两种类型的大小(尺寸):整数大小(对应于 Size 类,与 GDI 的 MFC 类 CSize 类似)和浮点数大小(对应于 SizeF 类)。下面分别加以介绍:

(1)整数大小类 Size:

class Size { public: Size() {Width = Height = 0;} Size(INT width, INT height) {Width = width; Height = height;} ... public: INT Width; INT Height; // 宽和高,不再是 cx 和 cy };

注意,这里的大小与 GDI 的区别:SIZE 和 CSize 的分量成员为 cx 和 cy,不是宽和高。

(2)浮点数大小类 SizeF:

class SizeF 
{ 
public:
    SizeF() {Width = Height = 0.0f;}
    SizeF(REAL width, REAL height) {Width = width; Height = height;}
    ...
public:
    REAL Width; REAL Height;
};

1.4.3 Rect[F](矩形)

GDI+中,也有两种类型的矩形:整数矩形(对应于 Rect 类,与 GDI 的 MFC 类 CRect 类似)和浮点数矩形(对应于 RectF 类),下面分别加以介绍。

(1)整数矩形类 Rect:

class Rect 
{ 
public:
    Rect() {X = Y = Width = Height = 0;}
    Rect(INT x, INT y, INT width, INT height);
    ...
    INT GetLeft() const {return X;} INT GetTop() const {return Y;}
    INT GetRight() const {return X+Width;} INT GetBottom() const {return Y+Height;}
    BOOL IsEmptyArea() const{return (Width <= 0) || (Height <= 0);} BOOL Equals(const Rect & rect) const;
    BOOL Contains(INT x, INT y) const; BOOL **Contains**(const Point& pt) const; BOOL Contains(Rect& rect) const;
    ...
    VOID Offset(const Point& point); VOID Offset(INT dx, INT dy);
public:
    INT X; INT Y; // 大写的 X 和 Y(为矩形左上角的坐标),不再是 left 和 top 
    INT Width; 
    INT Height; // 宽和高,不再是 right 和 bottom
};

注意,这里的矩形与 GDI 的区别:RECT 和 CRect 的分量成员是左、顶、右、底而不 是 X、Y、宽、高。虽然 Rect 中的(X, Y)等价于 RECT 的(left, top),但是 Rect 中的(Width, Height) 却不同于 RECT 的(right, bottom)。

(2)浮点数矩形类 RectF:

class RectF 
{ 
public:
    RectF() {X = Y = Width = Height = 0.0f;}
    RectF(REAL x, REAL y, REAL width, REAL height);
    ...
public:
    REAL X; 
    REAL Y;
    REAL Width; 
    REAL Height;
};

在 GDI 的 MFC 封装中,除了定义有点、大小和矩形的类外,还保留了对应的 API 结构 POINT、SIZE 和 RECT,主要是考虑运行效率及与底层 GDI API 的兼容。

比较可知,GDI 和 GDI+都有对应的几何类,不过 GDI+没有对应的结构(但有新增加 的浮点数版类),而 GDI 则没有对应的浮点数版类(但却有对应的结构)。