GDI+笔记

来源:互联网 发布:巴西足球知乎 编辑:程序博客网 时间:2024/06/07 15:29
Grapgics 对象是Gdi+的核心,Gdi+中使用的是非状态模型编程。
注意在开始调用GDI+的各种函数之前,应该使用 GdiplusStartup 函数对GDI+系统资源进行初始化
在结束GDI+调用之前,应该使用 GdiplusShutdown 函数对GDI+系统资源的销毁操作。


GDIplus.h是GDI+程序开发的基础,在GDI+中,字符使用双字节的UNICODE方式来表示,UNICODE主要使用


的字符类型是 WCHAR ,定义是 unsigned short.


TCHAR类型
当定义了_UNICODE宏时,TCHAR就是WCHAR,没有这个宏时TCHAR就是char;
在UNICODE方式中需要为一个字符串常量赋值时,可以使用L宏,如 BSTR wcsStr = L"unicode" ;




2.5.1 构造 Grapgics对象
Grapgics是GDI+程序设计的核心,有如下构造函数:
static Grapgics* FromHDC(HDC hdc);//hdc:设备环境句柄
static Grapgics* FromHDC(HDC hdc,HANDLE hDevice); // Hdevice:设备句柄 
static Grapgics* FromHDC(HWND hWnd, Bool icm); //hWnd;窗口句柄 , icm:是否使用色彩


配置文件校正色彩
static Grapgics* FromHDC(Image*  image); //image: 图像对象


Grapgics类的不同构造函数表明了对应的创建环境。如果指定从窗口句柄创建Grapgics对象,那么绘图


平面就是窗口,如果指定了图片作为Grapgics类,绘图平面就是图片。
















1.绘制直线
DrawLine(Pen *pen,Point& pt1,Point& pt2); pt2:线段起止点位置
DrawLine(Pen *pen,PointF& pt1,PointF& pt2);
DrawLine(Pen *pen,INT x1,INT y1,INT x2 ,INT y2); X1,Y1,X2,Y2:线段起止点坐标
DrawLines(Pen *pen,Point* points , INT count); points:直线端点数组
DrawLines(Pen *pen,PointF* points , INT count);count:线段定义点总数




2.绘制矩形
DrawRectangle(Pen* pen,Rect& rect); //rect:矩形区间
DrawRectangle(Pen* pen,INT x,INT y,INT width,INT height); 
更画直线一样,GDI+提供一次绘制多个矩形的函数,如下:
DrawRectangles(Pen* pen,Rect*  rects, INT count)


例子;
Rect rect1(10.0f,10.0f,100.0f,50.0f);
Rect rect2(10.0f,10.0f,100.0f,50.0f);
Rect rects[] ={rect1, rect2};
Rect* pRects = rects;
Grapgics.DrawRectangles(&blackPen, pRects,3);




3.绘制曲线和贝塞尔曲线
GDI+提供了 DrawCurve 和 DrawClosedCurve(封闭曲线),使用方法相同,但是封闭曲线如果给出的首位


点不重合,会自动光滑连接首尾点


DrawCurve(Pen* pen, Point* points, INT count); points,count :定义曲线的点及点的个数
DrawCurve(Pen* pen, Point* points, INT count,REAL tension); tension:曲线的弯曲强度,


贝塞尔曲线最初用于汽车工业设计,现在在计算机辅助设计CAD,TrueType字体的定义都有广泛运用,在


计算机图像中仅次于 直线和椭圆弧线。
用4个点来指定的曲线:2个端点和2个控制点,曲线连接2个端点,不通过控制点,控制点的位置控制曲


线的弯曲方向,控制点的行为像磁铁一样将曲线推向某个方向,并影响曲线的弯曲方向。


myGraphics.DrawBezier(&myPen, 0, 0, 40, 20, 80, 150, 100, 10);
它的起点为(0,0),控制点为(40,20)和(80,150),终点为(100,10)。


多边形:
DrawPolygon(Pen* pen , Point* points, INT count);






2.5.4 色彩
GDI+有2种色彩表述方式:RGB和CYMK
GDI+中对色彩添加了透明度支持,透明度是像素之间的一种合成运算:
输出色彩 = 前景色 X 透明度 /255  + 背景色 X (255 - 背景色) /255 




5.绘制几何图形
DrawArc(Pen* pen, Rect& rect ,REAL satrAngle, REAL sweepAngle);
DrawArc(Pen* pen, INT x,INT y, INT width ,INT height ,REAL sweepAngle, REAL sweepAngle);
rect;定义弧线的矩形
satrAngle:从x轴到弧线的起始点沿顺时针方向度量的角度
sweepAngle: 从satrAngle参数到弧线的结束沿顺时针方向度量的角度。














2.5.3 填充区域
FillClosedCurve 填充封闭曲线
FillEllipes 填充椭圆
FillPath 填充路径
FillPie 填充扇形
FillPolygon 填充多边形
FillRectangle 填充矩形
FillRectangles 填充矩形集合
FillRegion 填充区域


这些函数都: 先构造画刷,后进行区域填充。
画刷有5种:单色画刷,影线画刷,纹理画刷,线性渐变画刷,路径渐变画刷。






2.5.5 输出文本
Graphics类通过DrawString函数来完成丰富的文本输出效果
DrawString(string,length,font,layoutRect,StringFormt,brush);
DrawString(string, length,Font,origin,brush);
DrawString(String,length,font,origin,syringFormat,brush);
string:双字节文本
layoutRect,origin:文本输出的位置
stringFormar:文本输出格式
Brush:输出文本时锁使用的画刷






第三章 画笔和画刷


3.1 画笔用于描绘图形轮廓。GDI+画笔除了具有色彩和宽度属性之外,还添加其他属性,如对其方


式,线帽及变换方式等


Pen类构造函数如下:
Pen(color,width); //构造一个宽度为width,色彩为color的画笔
Pen(Color(255,255,0,0),4.0f);
Pen(brush,width); //指定画刷构造一个指定宽度的画笔


成员函数 SetDashStyle(DashStyle)可以设置画笔线型,DashStyle枚举如下
enum DashStyle{
DashStyleSolid =0, //实线
DashStyleDash =1, //虚线
DashStyleDot =2, //点线
DashStyleDashDot =3, //点划线
DashStyleDashDotDot =4, //双点划线
DashStyleCustom =1 //自定义线型
};


成员函数 SetAligoment(PenAligonment);可以设置画笔对其方式,PenAligonment枚举如下
enum PenAligonment{
PenAligonmentCenter =0, //居中
PenAligonmentInset =1, //嵌入
};


3.1.3 画笔的缩放及旋转
成员函数 ScaleTransform(Matrix&) ;缩放变换,使用方法:
Matrix matrix(1,0,0,2,0,0);
pen.ScaleTransform(&matrix)


成员函数 pen.SetLineJoin(LineJoinRound); 设置连接点方式.有4种,在LineJoin枚举中:
enum LineJoin{
LineJoinMiter =0,
LineJoinBevel =1,
LineJoinRound =2,
LineJoinMiterClipped =3
};


画笔的透明度,是相对于背景色而言的,线条透明度越大,背景的可见度就越大。




3.2 使用画刷
SolidBrush //单色画刷,填充图案
HatchBrush //影线画刷,用各种线形图案填充图形
TextureBrush //纹理画刷,使用基于光栅的图案填充图形
LinearGradientBrush //线形渐变画刷,
PathGradientBrush //路径渐变画刷


单色画刷: SolidBrush shua(Color(255,0,255,0));
GraphicsPath tmpth(FillModeAltemate); 创建一个图形路径对象


影线画刷:HatchBrush(HatchStyle haichstyle,const Color& foreColor,const Color& backColor);
haichstyle:影线画刷类型,foreColor:前景色,backColor:背景色


纹理画刷的作用实际上就是讲图片在目标区域平铺;
TextureBrush(Image* image,Rect& dsRect,ImageAttributes* imageAttributes)
TextureBrush(image,wrapMode)
TextureBrush(Image* image,WrapMode wrapMode,Rect& dsRect)
dstRect;指定图案用于画刷中的矩形区域,大小不能超过图案的范围
wrapMode:指定画刷如何排列图案


1.纹理画刷的排列方式,既可以在TextureBrush画刷的构造函数中指定,也可以SetWrapMode()函数修改
enum WrapMode{
WrapModeTile, //图片平铺
WrapModeTileFlipX, //水平向上翻转并平铺
WrapModeTileFlipY, //垂直向上翻转
WrapModeTileFlipXY, //水平和垂直方向上同时翻转
WrapModeClamp //不平铺
};


纹理画刷的变换,程序中多次使用ResetTransform重置纹理画刷,是因为这3种变换是可以叠加的.
RotateTransform(30) //将画刷旋转30度
ResetTransform() //重置之前的变换
ScaleTransform(3.1) //将画刷在水平方向扩大3倍
TranslateTransform(30,0,MatrixOrderAppend) //将画刷在水平方向平移30个像素








3.2.4 线性渐变画刷
线性渐变画刷可以使双色渐变,也可以是多色的.
LinearGradientBrush(Point& point1,Point% point2, Color& color1, Color& color2)
LinearGradientBrush(Rect& rect,Color& color1,Color& color2,REAL angle,BOOL isAngleScalable)
color1,color2:起点,终点颜色
point1,poinr2:起点,终点坐标
isAngleScalable:画刷是否旋转
Angle;旋转角度
原创粉丝点击