## 1.4 几何辅助类
与 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 则没有对应的浮点数版类(但却有对应的结构)。