MFC使用GDI+,在对话框中的设置

来源:互联网 发布:高音质音乐软件 编辑:程序博客网 时间:2024/04/28 06:26

本帖最后由 pmy1117 于 2010-10-20 10:50 编辑

今天算是看了一天的GDI+,总体感觉,确实GDI+对于GDI来说做了许多扩展,很方便也很实用。但是,相比GDI来说,还是有些不足之处,比如,不能应用双缓冲技术(我也不明白是什么)。
对于GDI+的配置我就不细说了,网上多的是。在此我仅说一下对于在“对话框”中GDI+的基本使用。
在对话框应用类当中添加:
头文件以及命名空间:

  1. #include <gdiplus.h>
  2. using namespace Gdiplus;
复制代码
然后在头文件中定义变量:
  1. ULONG_PTR m_gdiplusToken;
复制代码
在应用类InitInstance()中,CWinApp::InitInstance()之前(都说是在这个之前,我没试过),添加初始化代码:
  1. GdiplusStartupInput gdiplusStartupInput;
  2. GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
复制代码
在应用类添加虚函数ExitInstance();在其中添加:
  1. GdiplusShutdown(m_gdiplusToken);
复制代码
如果还是有问题,可以添加链接:“项目”->“属性”->“配置属性”->“链接器”->“输入”->“附加依赖性” gdiplus.lib   确定。
由于对话框中没有函数OnDraw();所以我获取dc的方式为:
  1. CWnd* pWnd;
  2. pWnd=GetDlgItem(IDC_STATIC);
  3. CDC* pdc;
  4. pdc=pWnd->GetDC();
  5. Graphics my_Graph(pdc->m_hDC);
复制代码
(也许还有更好的方法,还忘指点)接下来就是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)的内部

在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可以让我们根据自己的需要使用不同质量效果的插补算法。当然,质量越高,其渲染时间越长。



转帖:http://www.cctry.com/thread-7897-1-1.html