C++/GDI+ 学习笔记(三)——基础

GDI+ 的主要画刷

SolidBrush 单色画刷
 
SolidBrush(const Color& color );
 


HatchBrush 网格画刷
 
HatchBrush(
  HatchStyle hatchStyle,
  const Color& foreColor,
  const Color& backColor);
 foreColor和backColor用来指定阴影线颜色和填充的背景颜色,背景色可以不指定。hatchStyle用来指定阴影线的样式。
 
预定义样式:
HatchStyleHorizontal (水平线)
HatchStyleVertical(垂直线)
HatchStyleForwardDiagonal(上斜线)
HatchStyleBackwardDiagonal(下斜线)
HatchStyleCross(十字线)
HatchStyleDiagonalCross (交叉线)
HatchStyle30Percent(30%填充)
HatchStyleSolidDiamond (实心菱形)
 

 

LinearGradientBrush 直线渐变
 
LinearGradientBrush(
  Point & point1,
  Point & point2,
  Color & color1,
  Color & color2);

LinearGradientBrush(
  Rect & rect,
  Color & color1,
  Color & color2,
  REAL angle,
  BOOL isAngleScalable );

LinearGradientBrush(
  Rect & rect,
  Color & color1,
  Color & color2,
  LinearGradientMode mode);
 point1和point2分别用来指定矩形区域的左上角和右下角点座标。

color1和color2分别用来指定 渐变起始和终止的颜色。

rect用来指定一个矩形区域的大小和位置,angle用来指定渐变的方向角度,正值为顺时针。

isAngleScalable是一个即将废除的参数。mode用来指定渐变的方法。
 
预定义样式:
LinearGradientModeHorizontal (水平方向)
LinearGradientModeVertical (垂直方向)
LinearGradientModeForwardDiagonal (从左下到右上的对角线方向)
LinearGradientModeBackwardDiagonal (从左上到右下的对角线方向)
 

 

PathGradientBrush 路径渐变
 
PathGradientBrush(
  const GraphicsPath* path);

PathGradientBrush(
  const  Point * points,
  INT count,
  WrapMode wrapMode);
 path用来指定一个路径指针,points和count分别用来指定组成路径的一系列直线端点的数组及其大小, wrapMode是一个可选项,用来指定填充的包围模式。一个包围模式用来决定是否在区域内部、在区域外部以及所有区域都填充。默认时,其值为 WrapModeClamp,即在区域内部填充。
 

 

TextureBrush 图像画刷
 
TextureBrush(Image*, WrapMode);
 

 

矩阵

图形变换一般是对图形的几何信息经过几何变换后产生新的图形。常见二维图形的变换有平移、比例、对称、旋转、错切 等。图形几何变换最有效的手段是采用矩阵变换,GDI+就有这样的矩阵类Matrix,它为我们提供了许多变换的方法,如Invert(转置)、 Multiply(矩阵相乘)、Rotate(旋转)等。

需要说明的是,除了使用Matrix进行图形变换外,Graphics本身提供相应的变换方法,如RotateTransform(旋转变换)、ScaleTransform(比例变换)和TranslateTransform(平移变换)等。

基本绘图函数


绘图函数 功能描述
 
DrawArc 绘制一条圆弧曲线,范围由起止角大小决定,大小由矩形或长宽值指定
 
DrawBezier 绘制一条由一系列型值顶点决定的三次Bezier曲线
 
DrawBeziers 绘制一系列的三次Bezier曲线
 
DrawClosedCurve 绘制一条封闭的样条曲线
 
DrawCurve 绘制一条样条曲线
 
DrawEllipse 绘制一条椭圆轮廓线,大小由矩形或长宽值指定
 
DrawLine 绘制一条直线
 
DrawPath 绘制由GraphicsPath定义的路径轮廓线
 
DrawPie 绘制一条扇形(饼形)轮廓线
 
DrawPolygon 绘制一个多边形的轮廓线
 
DrawRectangle 绘制一个矩形
 
FillEllipse 填充一个椭圆区域
 
FillPath 填充一个由路径指定的区域
 
FillPie 填充一个扇形(饼形)区域
 
FillPolygon 填充一个多边形区域
 
FillRectangle 填充一个矩形区域
 
FillRectangles 用同一个画刷填充一系列矩形区域
 
FillRegion 填充一个区域(Region)的内部
 

 

文字


Font( FontFamily* ,  REAL ,  INT ,  Unit )            字体的主要构造函数

FontFamily fontFamily(L"幼圆");      //定义字型
Font font(&fontFamily, 12, FontStyleRegular, UnitPoint);   //定义字体
 

FontFamily * : 指向用来定义字型的类的指针。

REAL : 字号,这里的字号可以使用小数定义。而且字号的单位也是由第4个参数指定的。

INT : 字体风格,FontStyleRegular(正常)、FontStyleBold(加粗)、 FontStyleItalic(斜体)、FontStyleBoldItalic (粗斜体)、FontStyleUnderline(下划线) 和FontStyleStrikeout(删除线)。

Unit : GDI+为用户提供了UnitDisplay(1/75英寸)、UnitPixel(像素)、UnitPoint(点)、UnitInch(英寸)、UnitDocument(1/300英寸)、UnitMillimeter(毫米)等字体尺寸单位。

 

为了兼容GDI 字体还有其他的几个构造函数

Font( HDC hdc, const LOGFONTW* logfont) 是其中比较常用的构造函数之一,可以看出是完全与GDI兼容的。

GDI+只有一个输出文本的函数DrawString,原型如下

DrawString( const WCHAR* string, INT length, const Font* font,
const RectF& layoutRect, const StringFormat* stringFormat,
const Brush* brush );

DrawString( const WCHAR* string, INT length, const Font* font,
const PointF& origin, const Brush* brush );

DrawString( const WCHAR* string, INT length, const Font* font,
const PointF& origin, const StringFormat* stringFormat,
const Brush* brush);
 

其中,string用来指定要输出的字符串,length表示该字符串的长度,font用来指定字体, layoutRect用来指定一个字符串所输出的矩形区域,stringFormat用来指定文本输出格式化属性,origin用来指定字符串输出的起 点。需要注意的是,PointF和RectF类与Point和Rect类基本相同,所不同的是数据类型是浮点而后者是INT型。brush用来指定一个画 刷,这个画刷既可以是SolidBrush和HatchBrush,也可以是TextureBrush(纹理画刷),甚至是渐变画刷。

在GDI+中,我们还可以通过SetTextRenderingHint来控制文本输出的质量。

文本的格式属性通常包括对齐方式、字符间隔以及文本调整等。GDI+提供StringFormat类来控制这些格式属性,通常我们调用以下几个函数来进行相关属性设置。

Status SetAlignment ( StringAlignment align );
Status SetLineAlignment ( StringAlignment align );

上面的两个函数是用来定义文本对齐方式的,align可以是StringAlignmentNear(左对齐或右对齐,取决于书写方向是从左到右还是从右到左)、StringAlignmentCenter(居中)或StringAlignmentFar(两端对齐)。

Status SetFormatFlags( INT flags );

该函数用来设置文本格式化标志,flags可以是

StringFormatFlagsDirectionRightToLeft (水平阅读方向是从右向左) 和

StringFormatFlagsDirectionVertical(垂直文本)等值。

 图像


GDI+的Image类封装了对BMP、GIF、JPEG、PNG、TIFF、WMF(Windows元文件)和 EMF(增强WMF)图像文件的调入、格式转换以及简单处理的功能。而Bitmap是从Image类继承的一个图像类,它封装了Windows位图操作的常用功能。例如,Bitmap::SetPixel和Bitmap::GetPixel分别用来对位图进行读写像素操作,从而可以为图像的柔化和锐化处理提供一种可能。

Metafile类别通过提供记录和检验矢量图像的其它方法,增强Image类别的功能。

DrawImage是GDI+的Graphics类显示图像的核心方法,它的重载函数有许多个。常用的一般重载函数有:

Status DrawImage( Image* image, INT x, INT y);
Status DrawImage( Image* image, const Rect& rect);
Status DrawImage( Image* image, const Point* destPoints, INT count);
Status DrawImage( Image* image, INT x, INT y, INT srcx, INT srcy,
INT srcwidth, INT srcheight, Unit srcUnit);
 

其中,(x,y)用来指定图像image显示的位置,这个位置和image图像的左上角点相对应。rect用来指定被图像填充的矩形区域, destPoints和count分别用来指定一个多边形的顶点和顶点个数。若count为3时,则表示该多边形是一个平行四边形,另一个顶点由系统自动给出。此时,destPoints中的数据依次对应于源图像的左上角、右上角和左下角的顶点座标。srcx、srcy、srcwidth 和srcheight用来指定要显示的源图像的位置和大小,srcUnit用来指定所使用的单位,默认时使用PageUnitPixel,即用像素作为度量单位。

需要注意的是,在不指定范围的情况下,DrawImage会拉伸图像铺满整个设备。

Image还提供GetThumbnailImage的方法用来获得一个缩略图的指针,调用DrawImage后可将该缩略图显示,这在图像预览时极其有用。

Status DrawImage( Image* image, const Point* destPoints, INT count);
里面的destPoints和count用来指定一个数组和数组的大小。这个重载可以用来旋转图像。destPoints中的第一个点是用来定义座标原点的,第二点用来定义X轴的方法和图像X方向的大小,第三个是用来定义Y轴的方法和图像Y方向的大小。若destPoints定义的新座标系中两轴方向不垂直,就能达到图像拉伸的效果。当然,对于图像旋转还可直接使用Graphics::RotateTransform来进行,例如下面的代码。但这样设置后,以后所有的绘图结果均会旋转,有时可能感觉不方便。

当图像进行缩放时,需要对图像像素进行插补,不同的插补算法其效果是不一样的。Graphics:: SetInterpolationMode可以让我们根据自己的需要使用不同质量效果的插补算法。当然,质量越高,其渲染时间越长。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/eplanet/archive/2007/10/10/1817952.aspx

发布了49 篇原创文章 · 获赞 8 · 访问量 21万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章