💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 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 则没有对应的浮点数版类(但却有对应的结构)。