1.在stdafx.h中添加相应头文件和库文件:
#include <gdiplus.h>#pragma comment(lib,"gdiplus.lib")
2.打开类视图,在C<项目名>App类中添加变量:
ULONG_PTR m_gdiplusToken;
3.在APP类的InitInstance函数中建立tmpInput变量,初始化:
Gdiplus::GdiplusStartupInput tmpInput;Gdiplus::GdiplusStartup(&m_gdiplusToken,&tmpInput,NULL);
4.在APP类的ExitInstance函数中释放m_gdiplusToken变量:
Gdiplus::GdiplusShutdown(m_gdiplusToken);
5.在CChildView类中编辑OnPaint消息
using namespace Gdiplus; //使用命名空间gdiplusGraphics graphics(dc.GetSafeHdc()); //初始化一个画布对象,也可以这样写:Graphics graphics(GetDC()->m_hDC);Pen redPen(Color(255,0,0),3); //初始化一系列绘图工具(画刷,画笔等)HatchBrush gbBrush(HatchStyleCross, Color(0, 255, 0), Color(0, 0, 255)); //有交叉效果的画刷 graphics.DrawRectangle(&redPen, 50, 50, 500, 500); //画笔画一个矩形框graphics.FillRectangle(&gbBrush, 50, 50, 500, 500); //画刷填充矩形
这样就画出了一个红色框,内部蓝色和绿色填充并有交叉效果的大小为450*450的矩形。
画笔,画刷对象:
1.画笔
画笔的风格可以根据SetDashStyle和SetDashPattern两个函数设置.
SetDashStyle函数中设置的风格都是系统自己设置的.
Graphics graphics(GetDC()->m_hDC);Pen NewPen(Color(255,0,0),10);NewPen.SetDashStyle(DashStyleDash); //虚线效果NewPen.SetDashStyle(DashStyleDot); //点线效果NewPen.SetDashStyle(DashStyleDashDot); //点划线效果NewPen.SetDashStyle(DashStyleSolid); //实线NewPen.SetDashStyle(DashStyleDashDotDot); //双点线
SetDashPattern函数可以设置我们自己设计的风格.代码如下:
Pen pen(Color(255,0,0),10);REAL dashVal1[4] = {1,2,3,4};REAL dashVal2[6] = {1,2,3,4,5,6};pen.SetDashPattern(dashVal1,4);graphics.DrawLine(&pen,100,100,500,100);pen.SetDashPattern(dashVal2,6);graphics.DrawLine(&pen,100,140,500,140);
可以看到,自定义的效果就是,一个数字用于画线,一个数字用于间隔.
还可以设置线条的开始处和结尾处的风格.
Pen pen(Color(255,0,0),10);pen.SetStartCap(LineCapFlat);pen.SetEndCap(LineCapSquare);pen.SetStartCap(LineCapRound);pen.SetEndCap(LineCapRoundAnchor);pen.SetStartCap(LineCapDiamondAnchor);pen.SetEndCap(LineCapArrowAnchor);
2.画刷
定义不同样式的画刷:
HatchBrush(HatchStyle hatchStyle,const Color& foreColor,const Color& backColor);HatchStyle取值与效果图依次如下:HatchStyleHorizontal(水平)HatchStyleVertical(垂直线)HatchStyleForwardDiagonal(上斜线)HatchStyleBackwardDiagonal(下划线)HatchStyleCross(十字线)HatchStyleDiagonalCross(交叉线)HatchStyle30Percent(30%填充)HatchStyleSolidDiamond(实心菱形)
直线渐变画刷:
LinearGradientBrush(Rect &rect,Color& color1,Color& color2,LinearGradientMode mode);mode取值和效果图依次如下:LinearGradientModeHorizontal(从左到右渐变色)LinearGradientModeVertical(从上到下渐变色)LinearGradientModeForwardDiagonal(从左上到右下渐变色)LinearGradientModeBackwardDiagonal(从右上到左下渐变色)
路径渐变画刷:
PathGradientBrush(const GraphicsPath *path);Graphics graphics(GetDC()->m_hDC);GraphicsPath path;path.AddEllipse(50,50,200,200); //画一个路径图PathGradientBrush pathBrush(&path); //以路径图构造一个画刷pathBrush.SetCenterColor(Color(255,0,0)); //设置中心颜色.graphics.FillRectangle(&pathBrush,50,50,200,200); //渐变效果为由中心到四周渐淡
路径函数和路径画刷的综合应用:
Graphics graphics(GetDC()->m_hDC);Pen pen(Color::Blue,3); //构造画笔Point pt1(50,200),pt2(100,150),pt3(160,180),pt4(200,200),pt5(230,150)pt6(220,50),pt7(190,70),pt8(130,220); //构造若干点Point curvePoints[8] = {pt1,pt2,pt3,pt4,pt5,pt6,pt7,pt8};Point *pCurve = curvePoints;GraphicsPath = path; path.AddClosedCurve(curvePoints,8,0.5); //以上述若干点构造路径PathGraphicsBrush brush(&path); //以路径构造画刷Brush.SetCenterColor(Color(0,0,255)); //设置中心颜色graphics.DrawClosedCurve(&pen,curvePoints,0,0.5); //绘制路径图外围graphics.FillPath(&brush,&path); //填充路径图内部DrawImage函数用来可以画图,包括BMP,GIF,JPEG,PNG,TIFF,WMFStatus DrawImage(Image *image,INT x,INT y);Status DrawImage(Image *image,INT x,INT y,INT srcx,INT srcy,INT srcwidth,INT srcheight,UnitsrcUnit);
其中第2个函数可以用来实现一些特殊的效果.
GetThumbnailImage可以获得缩略图的指针.Image image(L“ImageName”);Image *pThumbnail = image.GetThumbnailImage(50,50,NULL,NULL)graphics.DrawImage(pThumbnail,20,20); //在20,20点处显示缩略图.
旋转的方法
Point newPoints[] = {Point(x1,y1),Point(x2,y2),Point(x3,y3)};graphics.DrawImage(&image,newPoints,3);
还有另外一个方法,利用移动坐标原点,和旋转角度来实现.
graphics.TranslateTransform(x1,y1); //转换(0,0)到(x1,y1)graphics.RotateTransform(30); //顺时针旋转30度graphics.DrawImage(&image,0,0); //显示图片.利用SetInterpolationMode来设置效果的补差.graphics.SetInterpolationMode(InterpolationModeNearestNeighbor);graphics.SetInterpolationMode(InterpolationModeHighQualityBilinear)graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic);
CImage:
1.使用CImage首先要包含#include <atlimage.h>头文件,然后Load.
CImage image;image.Load(“ImageName”);image.Draw(pDC->m_hDC,0,0);
2.CImage::Save方法可以把图像保存成另一种文件格式.
HRESULT Save(LPCTSTR pszFileName,REFGUID guidFileType = NULL);
guidFileType为空的时候就是默认的文件格式.还有其他格式:
GUID_BMPFile(BMP格式),GUID_PNGFile(PNG格式),
GUID_JPEGFile(JPEG格式),GUID_GEFFile(GIF格式),
3.转换成黑白颜色
if(!image.IsIndexed()){COLOREF pixel;byte r,g,b,avg;for(int x=0;x<image->GetHeight();x++){for(int y=0;y<image->GetWidth();jj++){r=GetRValue(pixel);g=GetGValue(pixel);b=GetBValue(pixel);avg=(int)((r+g+b)/3);image->SetPixelRGB(x,y,avg,avg,avg);}}}else{int max=image->GetMaxColorTableEntrise();RGBQUAD *ColorTable=new RGBQUAD[max];Image->GetColorTable(0,max,ColorTable);for(int ii=0;ii<max;ii++){int avg=(ColorTable[i].rgbBlue+…)/3;ColorTable[i].rgbBlue=avg;…}image->SetColorTable(0,max,ColorTable);delete ColorTable;}