成/重新生成解决方案”菜单项,或按“Ctrl+Alt+F7”组合键,来重新编译一次项目。
为了不修改原始安装目录中的GdiplusBase.h头文件,可以: ? 将该头文件复制到你的项目目录中。
? 注释掉该头文件里面GdiplusBase类的内容(保留类定义)。
? 在项目中所有的#include
#include \#include
? 则编译系统会优先包含项目目录中的gdiplusBase.h头文件,从而屏蔽掉原来位于
平台SDK的Include目录中的同名头文件。
2.用&代替new
也可以在有些需要使用new的地方改用&,例如将代码Pen *pPen = new Pen(Color::Red); 改为 Pen *pPen = &Pen(Color::Red);。
3.采用发行配置
将解决方案配置改为发行(Release)状态后,再重新编译项目。不过,这样做虽然能够解决GDI+的new问题,但是会造成不能调试GDI+项目的新问题。
12.4 几何辅助类
与GDI的类似,在GDI+ API中也定义了许多绘图的辅助类,常用的有点、大小和矩形等几何类。它们都是没有基类的独立类,被定义在头文件GdiplusTypes.h中。与GDI不同的是,在GDI+中新增加了浮点型的几何类。
浮点数版的几何对象和绘图方法,是GDI+新增的功能,这些在各种工程技术领域是非常有用的。因为一般实际的图形设计,都是基于实数坐标的。包括机械(机床/汽车/轮船/飞机等)、建筑(房屋/桥梁/道路/堤坝等)和(3D)图形动画设计(形状/物体/人物/背景/轨迹等)等设计,都必须使用浮点参数和坐标系。
下面对GDI+的几何辅助类,逐个进行简单的介绍。
16
12.4.1 点类Point[F]
GDI+中,有两种类型的点:整数点(对应于Point类,与GDI和MFC中的POINT结构和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 };
其中,INT为4字节有符号整数的重定义类型(windef.h):typedef int INT;。
注意,GDI+中点的数据成员,与GDI和MFC中点的区别:前者的Point采用大写的X、Y,而后者的POINT和CPoint采用小写的x、y。
2.浮点数点类PointF
class PointF { public:
PointF() {X = Y = 0.0f;}
PointF(REAL x, REAL y) {X = x; Y = y;}
?? // 与整数版的类似 public:
17
REAL X; };
REAL Y;
其中,REAL为4字节浮点数的重定义类型(GdiplusTypes.h):typedef float REAL;。
12.4.2 大小类Size[F]
在GDI+中,也有两种类型的大小(尺寸):整数大小(对应于Size类,与GDI和MFC中的SIZE结构和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和MFC中大小的区别:SIZE和CSize的分量成员为cx和cy,而不是宽(Width)和高(Height)。
2.浮点数大小类SizeF:
class SizeF { public:
SizeF() {Width = Height = 0.0f;}
SizeF(REAL width, REAL height) {Width = width; Height = height;}
??
public:
REAL Width; REAL Height; };
18
12.4.3 矩形类Rect[F]
在GDI+中,也有两种类型的矩形:整数矩形(对应于Rect类,与GDI和MFC的RECT结构和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+中的矩形与GDI和MFC中矩形的区别:RECT和CRect的分量成员是左(left)、顶(top)、右(right)、底(bottom),而不是这里的X、Y、宽(Width)、高(Height)。虽然Rect中的(X, Y)等价于RECT和CRect中的(left, top),但是Rect中的(Width, Height)却
19
完全不同于RECT和CRect中的(right, bottom),这一点在以后的GDI+编程中应该特别留意。
例如:
CRect r;
GetClientRect(&r);
Rect rect(r.left, r.top, r.Width(), r.Height());
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和MFC中所没有的浮点数版几何类。
12.5 颜色
与GDI相比,GDI+的颜色新增了一个透明分量,并且定义了颜色类Color。
12.5.1 颜色类型ARGB
GDI+中的颜色,与GDI中的颜色的最大不同,是增加了一个字节(8位)的透明分量alpha(α),用来表示颜色的不透明度:0透明(看不见前景色,只有背景色)~255不透明(看不见背景色,只有前景色,相当于覆盖和拷贝)。背景色指屏幕窗口中原有图形的颜色,前景色指将要绘制图形的颜色。GDI中的颜色,相当于GDI+中α=255的特殊情形。
因此,GDI+中的颜色一般都是用四个字节表示(Intel CPU中,多字节整数的低位在前):
20