GdiPlus基础:
建立构架:
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; //使用命名空间gdiplus
Graphics 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,WMF
Status 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;
}