12GDI+基础编程 - 图文(4)

2020-02-20 17:49

成/重新生成解决方案”菜单项,或按“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


12GDI+基础编程 - 图文(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:公积金养老保险等问题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: