GDI+学习笔记8-GDI+介绍
GDI+的介绍:
GDI+是Windows XP的一个子系统,它主要负责在显示屏幕和打印设备输出有关信息。
它是一组通过C++类实现的应用程序编程接口。
GDI+对以前的Windows版本中GDI进行了优化,并添加了许多新的功能。作为图形设备接口的GDI+使得应用程序开发人员在输出屏幕和打印机信息的时候无需考虑具体显示设备的细节,他们只需调用GDI+库输出的类的一些方法即可完成图形操作。
GDI+的使用方法:
在使用GDI+的cpp文件中包含GdiPlus.h文件,并引用命名空间,代码如下:
#include <GdiPlus.h>
using namespace Gdiplus;
在项目属性中,链接器的输入选项中,添加附加依赖项:gdiplus.lib
GDI+进行初始化:
// GDI+ 资源初始化
ULONG_PTR uToken = 0;
GdiplusStartupInput gdiplusStartupInput;
GdiplusStartup(&uToKen,&gdiplusStartupInput,NULL);
反初始化代码:
//销毁GDI+资源
GdiplusShutdown(uToken);
GDI+颜色系统:
透明度合成运算:
透明度是像素之间的一种合成运算。计算公式:
输出颜色=前景色*Alpha/255+背景色*(255-Alpha)/255
比如:ARGB(100,0,0,0)
背景色rgb(255,255,255);
输出颜色(155,155,155);
Bitmap类的构造:
Bitmap(const WCHAR *filename);
// 通过图片的文件名来构造一个Bitmap对象
Bitmap(INT width,INT height,PixelFormat format=PixelFormat32bppARGB);
// 通过位图的宽度,高度,像素格式来构造一个空的Bitmap对象,其中format的默认值是PixelFormat32bppARGB,代表32位的颜色信息,颜色组成是A,R,G,B。像素格式还有很多,
比如PixelFormat24bppRGB代表24位的颜色信息,颜色组成为R,G,B,比如PixelFormat16bppRGB,代表16位的颜色信息,颜色组成为R,G,B其中R占5位,G占6位,B占5位。
Bitmap类的常用方法:
Bitmap* Clone(
[in, ref] const Rect &rect,
[in] PixelFormat format
);
Bitmap* Clone(
[in, ref] const RectF &rect,
[in] PixelFormat format
);
Bitmap* Clone(
[in] REAL x,
[in] REAL y,
[in] REAL width,
[in] REAL height,
[in] PixelFormat format
);
Bitmap* Clone(
[in] INT x,
[in] INT y,
[in] INT width,
[in] INT height,
[in] PixelFormat format
);
以上四个方法为Bitmap的拷贝方法,从源位图的指定区域拷贝出新的位图对象出来,并用format像素格式应用在新的Bitmap对象中。
UINT GetWidth(): 获取位图的宽度
UINT GetHeight():
GetPixel(INT x,INT y,Color *color);
// 获取指定位置的颜色
SetPixel(INT x,INT y,const Color &color);
常用的画刷:
1). SolidBrush: 单色画刷;
SolidBrush(const Color &color);
SolidBrush blueBrush(Color(255,0,0,255));
2). HatchBrush: 阴影画刷;
HatchBrush(
[in] HatchStyle hatchStyle,
[in, ref] const Color &foreColor,
[in, ref] const Color &backColor
);
hatchStyle:影线画刷的类型
3). TextureBrush: 纹理画刷
TextureBrush(
[in] Image *image,
[in] wrapMode wrapMode,
[in, ref] const RectF &dstRect
);
...
4). LinearGradientBrush: 线性渐变画刷
LinearGradientBrush(
[in, ref] const PointF &point1,
[in, ref] const PointF &point2,
[in, ref] const Color &color1,
[in, ref] const Color &color2
);
point1: 渐变的起点坐标;
point2: 渐变的终点坐标;
color1: 为起点的颜色
color2: 为终点的颜色
Pen创建画笔
Pen(const Color &color,REAL width=1.0f);
// color为画笔的颜色,width为画笔宽度
Pen(const Brush *brush,REAL width=1.0f);
Graphics绘制图片:
DrawImage:
Graphics::DrawImage(Image*,Point*,INT)
Graphics::DrawImage(Image*,INT,INT)
Graphics::DrawImage(Image*,Point&)
..
Graphics绘制文本:
Graphics::DrawString(WCHAR*,INT,Font*,RectF&,StringFormat*,Brush*)
Graphics::DrawString(WCHAR*,INT,Font*,PointF&,Brush*)
Graphics::DrawString(WCHAR*,INT,Font*,PointF&,StringFormat*,Brush*)
绘制文本示例代码:
{
Gdiplus::Font myFont(L"Arial",10);
SolidBrush brushA(Color(255,0,0,255));
graphics.DrawString(L"示例文本",-1,&myFont,PointF(200,575),&brushA);
}
以下为带文本输出格式的字符串绘制代码:
{
Gdiplus::Font myFont(L"Arial",16);
RectF layout(0,0,500.0f,200.0f);
//设置对齐方式(水平居中对齐)
StringFormat format;
format.SetAlignment(StringAlignmentCenter);
SolidBrush brushB(Color(255,0,0,255));
graphics.DrawString(L"示例文本",-1,&myFont,layout,&format,&brushB);
Graphics::MeasureString(WCHAR*,INT,Font*,RectF&,RectF*)
Graphics::MeasureString(WCHAR*,INT,Font*,PointF&,StringFormat*,RectF*)
Graphics::MeasureString(WCHAR*,INT,Font*,RectF&,StringFormat*,RectF*,INT*,INT*)
Status MeasureString(
[in] const WCHAR *string,
[in] INT length,
[in] const Font *font,
[in, ref] const RectF &layoutRect,
[in] const StringFormat *stringFormat,
[out] RectF *boundingBox,
[out] INT *codepointsFitted,
[out] INT *linesFilled
) const;
Graphics::MeasureString(WCHAR*,INT,Font*,SizeF&,StringFormat*,SizeF*,INT*,INT*)
Status MeasureString(
[in] const WCHAR *string,
[in] INT length,
[in] const Font *font,
[in, ref] const SizeF &layoutRectSize,
[in] const StringFormat *stringFormat,
[out] SizeF *size,
[out] INT *codepointsFitted,
[out] INT *linesFilled
) const;
Graphics::MeasureString(WCHAR*,INT,Font*,PointF&,RectF*)
其中
string为要测量的字符串
length:要测量的字符串长度,-1表示测试以NULL结尾的string字符串
Font: 字符串输出采用的字体
layoutRect: 文本输出时,指定的矩形区域
layoutRectSize: 文本输出时,指定的尺寸
boundingBox为测量结果,表示容纳全部文本时,所需要的矩形区域。
size:测量结果,表示容纳全部文本时所需要的尺寸。
codepointsFitted: 测量结果,表示指定的区域中能够容纳的字符个数
linesFilled: 测量结果,表示指定的区域中,能够容纳的字符行数
origin: 文本输出起点
SetTrimming: 字符串去尾
SetTrimming(StringTrimming trimming);
StringTrimming枚举:
None
Character
Word
EllipsisCharacter
EllipsisWord
EllipsisPath
Graphics绘制直线:
Graphics::DrawLine(Pen*,Point&,Point&)
Graphics::DrawLine(Pen*,PointF&,PointF&)
Graphics::DrawLine(Pen*,REAL,REAL,REAL,REAL)
Graphics::DrawLine(Pen*,INT,INT,INT,INT)
Graphics::DrawLines(Pen*,Point*,INT)
Graphics::DrawLines(Pen*,PointF*,INT)
Graphics绘制矩形;
DrawRectangle()
Graphics绘制圆:
Graphics绘制饼:
DrawPie()
Graphics填充矩形:
FillRectangle()
FillPie()
GDI的设备描述表DC与GDI+的Graphics的作用与区别:
1).DC(设备描述表),是Windows使用的一个数据结构,用于存储具备设备能力和与如何在设备上重绘一些项目有关的属性信息。首先必须获得一个DC的句柄,如何在绘制图形时,把该句柄作为一个参数传递给GDI绘图函数。当然也可以把它传递给获得或设置DC有关属性的函数。
2). 利用GDI+函数,不必使用句柄或DC,可以简单地创建一个图形对象(Graphics),再调用它的方法,如myGraphicsObject.DrawLine(parameters).Graphics对象是GDI+的核心,正如DC是GDI的核心一样。它们在不同的环境下扮演同样的角色,发挥着类似的作用。不同之处: 前者使用基于句柄的编程方法,而后者使用面向对象的编程方法。
绘图对象的使用差别:
GDI:所有与绘图有关的绘图对象必须选入指定的设备描述表中(使用SelectObject函数),才能被指定的DC所使用。
GDI+:绘图前,把绘图对象作为参数传递给Graphics图形对象的方法调用即可。
GDI+新增的功能:
渐变的画刷:
基数样条函数
持久路径对象
变形和矩阵对象
可伸缩区域(Regions)
Alpha混合
多种图像格式支持(BMP,JPEG,PNG,GIF,TIFF)
GDI与GDI+混合编程
GDI+在GDI的设备环境DC上进行图形绘制:
Graphics gs(hDC)
GDI+就会把当前hDC作为默认的目标画布,之后调用Graphics中的任何函数都会被绘制到hDC上,当然每个函数的调用完成并不会立即反映在hDC中,只有当Graphics类析构时,才会把所有绘制的内容全部一次性拷贝到hDC中。
GDI在GDI+的绘图表面上绘图:
hDC=Graphic.GetHDC()
GDI+是Windows XP的一个子系统,它主要负责在显示屏幕和打印设备输出有关信息。
它是一组通过C++类实现的应用程序编程接口。
GDI+对以前的Windows版本中GDI进行了优化,并添加了许多新的功能。作为图形设备接口的GDI+使得应用程序开发人员在输出屏幕和打印机信息的时候无需考虑具体显示设备的细节,他们只需调用GDI+库输出的类的一些方法即可完成图形操作。
GDI+的使用方法:
在使用GDI+的cpp文件中包含GdiPlus.h文件,并引用命名空间,代码如下:
#include <GdiPlus.h>
using namespace Gdiplus;
在项目属性中,链接器的输入选项中,添加附加依赖项:gdiplus.lib
GDI+进行初始化:
// GDI+ 资源初始化
ULONG_PTR uToken = 0;
GdiplusStartupInput gdiplusStartupInput;
GdiplusStartup(&uToKen,&gdiplusStartupInput,NULL);
反初始化代码:
//销毁GDI+资源
GdiplusShutdown(uToken);
GDI+颜色系统:
透明度合成运算:
透明度是像素之间的一种合成运算。计算公式:
输出颜色=前景色*Alpha/255+背景色*(255-Alpha)/255
比如:ARGB(100,0,0,0)
背景色rgb(255,255,255);
输出颜色(155,155,155);
Bitmap类的构造:
Bitmap(const WCHAR *filename);
// 通过图片的文件名来构造一个Bitmap对象
Bitmap(INT width,INT height,PixelFormat format=PixelFormat32bppARGB);
// 通过位图的宽度,高度,像素格式来构造一个空的Bitmap对象,其中format的默认值是PixelFormat32bppARGB,代表32位的颜色信息,颜色组成是A,R,G,B。像素格式还有很多,
比如PixelFormat24bppRGB代表24位的颜色信息,颜色组成为R,G,B,比如PixelFormat16bppRGB,代表16位的颜色信息,颜色组成为R,G,B其中R占5位,G占6位,B占5位。
Bitmap类的常用方法:
Bitmap* Clone(
[in, ref] const Rect &rect,
[in] PixelFormat format
);
Bitmap* Clone(
[in, ref] const RectF &rect,
[in] PixelFormat format
);
Bitmap* Clone(
[in] REAL x,
[in] REAL y,
[in] REAL width,
[in] REAL height,
[in] PixelFormat format
);
Bitmap* Clone(
[in] INT x,
[in] INT y,
[in] INT width,
[in] INT height,
[in] PixelFormat format
);
以上四个方法为Bitmap的拷贝方法,从源位图的指定区域拷贝出新的位图对象出来,并用format像素格式应用在新的Bitmap对象中。
UINT GetWidth(): 获取位图的宽度
UINT GetHeight():
GetPixel(INT x,INT y,Color *color);
// 获取指定位置的颜色
SetPixel(INT x,INT y,const Color &color);
常用的画刷:
1). SolidBrush: 单色画刷;
SolidBrush(const Color &color);
SolidBrush blueBrush(Color(255,0,0,255));
2). HatchBrush: 阴影画刷;
HatchBrush(
[in] HatchStyle hatchStyle,
[in, ref] const Color &foreColor,
[in, ref] const Color &backColor
);
hatchStyle:影线画刷的类型
3). TextureBrush: 纹理画刷
TextureBrush(
[in] Image *image,
[in] wrapMode wrapMode,
[in, ref] const RectF &dstRect
);
...
4). LinearGradientBrush: 线性渐变画刷
LinearGradientBrush(
[in, ref] const PointF &point1,
[in, ref] const PointF &point2,
[in, ref] const Color &color1,
[in, ref] const Color &color2
);
point1: 渐变的起点坐标;
point2: 渐变的终点坐标;
color1: 为起点的颜色
color2: 为终点的颜色
Pen创建画笔
Pen(const Color &color,REAL width=1.0f);
// color为画笔的颜色,width为画笔宽度
Pen(const Brush *brush,REAL width=1.0f);
Graphics绘制图片:
DrawImage:
Graphics::DrawImage(Image*,Point*,INT)
Graphics::DrawImage(Image*,INT,INT)
Graphics::DrawImage(Image*,Point&)
..
Graphics绘制文本:
Graphics::DrawString(WCHAR*,INT,Font*,RectF&,StringFormat*,Brush*)
Graphics::DrawString(WCHAR*,INT,Font*,PointF&,Brush*)
Graphics::DrawString(WCHAR*,INT,Font*,PointF&,StringFormat*,Brush*)
绘制文本示例代码:
{
Gdiplus::Font myFont(L"Arial",10);
SolidBrush brushA(Color(255,0,0,255));
graphics.DrawString(L"示例文本",-1,&myFont,PointF(200,575),&brushA);
}
以下为带文本输出格式的字符串绘制代码:
{
Gdiplus::Font myFont(L"Arial",16);
RectF layout(0,0,500.0f,200.0f);
//设置对齐方式(水平居中对齐)
StringFormat format;
format.SetAlignment(StringAlignmentCenter);
SolidBrush brushB(Color(255,0,0,255));
graphics.DrawString(L"示例文本",-1,&myFont,layout,&format,&brushB);
}
Graphics::MeasureString(WCHAR*,INT,Font*,RectF&,RectF*)
Graphics::MeasureString(WCHAR*,INT,Font*,PointF&,StringFormat*,RectF*)
Graphics::MeasureString(WCHAR*,INT,Font*,RectF&,StringFormat*,RectF*,INT*,INT*)
Status MeasureString(
[in] const WCHAR *string,
[in] INT length,
[in] const Font *font,
[in, ref] const RectF &layoutRect,
[in] const StringFormat *stringFormat,
[out] RectF *boundingBox,
[out] INT *codepointsFitted,
[out] INT *linesFilled
) const;
Graphics::MeasureString(WCHAR*,INT,Font*,SizeF&,StringFormat*,SizeF*,INT*,INT*)
Status MeasureString(
[in] const WCHAR *string,
[in] INT length,
[in] const Font *font,
[in, ref] const SizeF &layoutRectSize,
[in] const StringFormat *stringFormat,
[out] SizeF *size,
[out] INT *codepointsFitted,
[out] INT *linesFilled
) const;
Graphics::MeasureString(WCHAR*,INT,Font*,PointF&,RectF*)
其中
string为要测量的字符串
length:要测量的字符串长度,-1表示测试以NULL结尾的string字符串
Font: 字符串输出采用的字体
layoutRect: 文本输出时,指定的矩形区域
layoutRectSize: 文本输出时,指定的尺寸
boundingBox为测量结果,表示容纳全部文本时,所需要的矩形区域。
size:测量结果,表示容纳全部文本时所需要的尺寸。
codepointsFitted: 测量结果,表示指定的区域中能够容纳的字符个数
linesFilled: 测量结果,表示指定的区域中,能够容纳的字符行数
origin: 文本输出起点
SetTrimming: 字符串去尾
SetTrimming(StringTrimming trimming);
StringTrimming枚举:
None
Character
Word
EllipsisCharacter
EllipsisWord
EllipsisPath
Graphics绘制直线:
Graphics::DrawLine(Pen*,Point&,Point&)
Graphics::DrawLine(Pen*,PointF&,PointF&)
Graphics::DrawLine(Pen*,REAL,REAL,REAL,REAL)
Graphics::DrawLine(Pen*,INT,INT,INT,INT)
Graphics::DrawLines(Pen*,Point*,INT)
Graphics::DrawLines(Pen*,PointF*,INT)
Graphics绘制矩形;
DrawRectangle()
Graphics绘制圆:
Graphics绘制饼:
DrawPie()
Graphics填充矩形:
FillRectangle()
FillPie()
GDI的设备描述表DC与GDI+的Graphics的作用与区别:
1).DC(设备描述表),是Windows使用的一个数据结构,用于存储具备设备能力和与如何在设备上重绘一些项目有关的属性信息。首先必须获得一个DC的句柄,如何在绘制图形时,把该句柄作为一个参数传递给GDI绘图函数。当然也可以把它传递给获得或设置DC有关属性的函数。
2). 利用GDI+函数,不必使用句柄或DC,可以简单地创建一个图形对象(Graphics),再调用它的方法,如myGraphicsObject.DrawLine(parameters).Graphics对象是GDI+的核心,正如DC是GDI的核心一样。它们在不同的环境下扮演同样的角色,发挥着类似的作用。不同之处: 前者使用基于句柄的编程方法,而后者使用面向对象的编程方法。
绘图对象的使用差别:
GDI:所有与绘图有关的绘图对象必须选入指定的设备描述表中(使用SelectObject函数),才能被指定的DC所使用。
GDI+:绘图前,把绘图对象作为参数传递给Graphics图形对象的方法调用即可。
GDI+新增的功能:
渐变的画刷:
基数样条函数
持久路径对象
变形和矩阵对象
可伸缩区域(Regions)
Alpha混合
多种图像格式支持(BMP,JPEG,PNG,GIF,TIFF)
GDI与GDI+混合编程
GDI+在GDI的设备环境DC上进行图形绘制:
Graphics gs(hDC)
GDI+就会把当前hDC作为默认的目标画布,之后调用Graphics中的任何函数都会被绘制到hDC上,当然每个函数的调用完成并不会立即反映在hDC中,只有当Graphics类析构时,才会把所有绘制的内容全部一次性拷贝到hDC中。
GDI在GDI+的绘图表面上绘图:
hDC=Graphic.GetHDC()