GDI+ 学习记录

GDI+ 简介:

GDI (Graphics Device Interface,图形设备接口),Windows 为图像绘制上提供的一组API接口。

GDI+ 是GDI的优化版本,对开发者的易用性更好。

使用方法:

	
	/*GDI+ 头文件*/
	#include <objidl.h>
	#include <gdiplus.h>
	/*系统以GdiPlus。dll 方式提供,需保护lib静态文件*/
	using namespace GdiPlus;
	#pragma Comment(lib,"Gdiplus.lib")
	
	//或者
	/*头文件已经包含了两个文件,并且链接了Gdiplus.lib静态文件*/
	#include <atlimage.h>
	using namespace Gdiplus;




	/*使用GDI  必须先初始化*/
	GdiplusStartupInput gdiplusStartupInput;
	ULONG_PTR gdiplusToken;
	GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
	
	..........
	..........
	..........


	//程序结束后关闭GDI+
	GdiplusShutdown(gdiplusToken);

Graphics类

Graphics类 是GDI+ API中的核心类,它提供了绘制直线,曲线,图像,图像和字符串的诸多成员函数。

Graphics类 一般情况下需要配合Pen、Foint、SoildBrush等类使用。

void Graphics(IN HDC hdc)
通过一个设备上下文来构造,用于在窗口绘图

void Graphics(IN Image* image)
通过一个Image类对象来构造,用于绘制图像

Graphics 类中的绘图函数:

成员函数函数功能
DrawLine画先函数
DrawLines画折线函数
DrawRectangle画折矩形
DrawRectangles画多个矩形
DrawEllipse画椭圆形
DrawArc画圆弧
DrawString画字符串
DrawPolygon画封闭的多边形区域
DrawPie画饼状图
FillRectangle填充矩形区域
FillEllipse填充椭圆
FillPolygon填充多边形
MeasureString测量字符串高度宽度
DrawIamge画图片(PNG,BMPJPG)
TranslateTransform平移变换
ResetTransfrom取消变换
ScaleTransform缩放变换
RotateTransform旋转变换

更多内容请移步微软GDI+文档

Graphics类 画实线

//画笔确定颜色与粗细 两点确定一条线
//画直线函数
Status DrawLine(IN const Pen* pen, //画笔对象
                IN REAL x1, // 起点X坐标
                IN REAL y1, // 起点Y坐标
                IN REAL x2, // 终点X坐标
                IN REAL y2) // 终点Y坐标


//画折线函数
//多个点确认折线线
    Status DrawLines(IN const Pen* pen,		//画笔对象
                     IN const Point* points,  	//坐标数组
                     IN INT count)		//坐标数组的长度

//pen 对象
//pen类是GDI+的画笔类

    Pen(IN const Color& color,  IN REAL width = 1.0f);
	/*通过一个颜色和宽度指定一个画笔*/
 
    Pen(IN const Brush* brush,  IN REAL width = 1.0f);
	/*通过一个画刷和宽度知道一个画笔*/

//Color 颜色类
   Color(IN BYTE r,IN BYTE g,IN BYTE b;
	/*通过,R值,G值,B值指定一个颜色*/
   Color(IN BYTE a, IN BYTE r, IN BYTE g,IN BYTE b);
   /*通过一个透明度,R值,G值,B值指定一个颜色*/
//PointF类
Pointf(REAL x,REAL y);
/*通过x,y值构造一个坐标点*/
Pointf(const SizeF &size)
/*通过SizeF值构造一个坐标点*/
//Status类
enum Status
{
	OK,
	GenericError,
	InvalidParameter,
	OutOfMemory,
	ObjectBusy,
	InsufficientBuffer,
	NotImplemented,
	......
	ProfileNotFound
};

Graphics类 画虚线 画箭头线

  • 画虚线
    Pen类提供SetDashStyle 成员方法函数来设置画笔样式
Status SetDashStyle(IN DashStyle dasgStyle);
enum DashStyle
{
	DashStyleSolid,		//实线
	DashStyleDash,		//由划线段组成的直线
	DashStyleDot,		//由点构成的直线
	DashStyleDashDot,	//划线点构成的直线
	DashStyleDashDotDot,	//划线点点图案构成直线
	DashStyleCustom		//自定义
};
  • 画带箭头的线
    Pen类的SetStartCap和SetEndCap方法指定线条末端的表现形式;线帽可以为扁平、方块、圆角、三角或者用户定义形状
//设置线起点
Status SetStartCap(IN LineCap startCap)

//设置线终点
Status SetEndCap(IN LineCap endCap);

//设置线中间
Status SetDashCap(IN DashCap dashCap);

enum LineCap
{
	LineCapFlat = 0,
	LineCapSquare = 1,
	LineCapRound = 2,
	LineCapTriangle = 3,

	LineCapNoAnchor = 0x10, //无
	LineCapSquareAnchor = 0x11, //正方形
	LineCapRounAnchor = 0x12	//圆角
	LineCapDiamondAnchor = 0x13, //钻石
	LineCapArrowAnchor	= 0x14,	  //箭头
	
	LineCapCustom  = 0xff, custom cap
	LineCapAnchorMask = 0xf0
};

enum DashCap
{
	DashCapFlat = 0, 	//无
	DashCapRound = 2,	//圆角
	DashCapTriangle	= 3  //三角
};

Graphics类 画矩形

  • 画矩形
//画笔确定粗细与颜色,两点 + 长宽确定矩形
Status DrawRectangle(IN const Pen *pen,	//画笔对象
IN REAL x,	//起点x坐标
IN REAL y,  //起点y坐标
IN REAL  width,  //宽
IN REAL  height	 //高
);

画笔确定粗细与颜色,矩形坐标确定形状
Status DrawRectangle(IN const Pen *pen,	//画笔对象
IN const Rect & rect	//矩形坐标
);
  • 画多个矩形
 Status DrawRectangles(IN const Pen *pen,	//画笔对象
IN const Rect & rects, 		//矩形坐标数组
IN INT count	// 矩形个数 );
  • Rect 类
 class Rect
 {	
 	.....
 	INt X;	//起点x坐标
 	INT Y;	//起点y坐标
 	INT Width;	//宽
 	INT Height;	 //高
 }

Graphics类 画圆形、圆弧

  • 画圆形
//画笔确定颜色与粗细,外切圆坐标确定椭圆
 Status DrawEllipse(
 IN const Pen *pen, 	//画笔对象
 IN REAL x,		//起点x坐标
 IN REAL y,		//起点y坐标
 IN REAL width,	//宽
 IN REAL height	//高
 );
 
//画笔确定颜色与粗细,外切圆坐标确定椭圆
 Status DrawEllipse(
 IN const Pen *pen, 	//画笔对象
 IN Rect & rect 		//矩形坐标
 );
  • 画圆弧
//画笔确定颜色与粗细,外切矩形确定椭圆
 Status DrawArc(
IN const Pen *pen,		//画笔对象
IN REAL x,					//起点x坐标
IN REAL y,					//起点y坐标
IN REAL width,			//宽
IN REAL height,			//高
IN REAL startAngle,	//开始角度
IN REAL sweepAngle	//圆弧角度
)

//画笔确定颜色与粗细,外切矩形与角度决定圆弧
 Status DrawArc(
IN const Pen *pen,		//画笔对象
IN const Rect &rect,	//内接矩形
IN REAL startAngle,	//开始角度
IN REAL sweepAngle	//圆弧角度
)

Graphics类 消除锯齿

  • 消除锯齿
    Graphics 类的成员函数提供反锯齿功能
    Status SetSmoothingMode(
    IN SmoothingMode smoothingMode //平滑模式
    )

  • SmoothingMode 类型

 enum SmoothingMode
 {
 	SmoothingModeInvalid = QualityModeInvalid,	//无效模式
 	SmoothingModeDefault = QualityModeDefault,		//默认
 	SmoothingModeHighspeed = QualityModeLow,		//高速度,低质量
 	SmoothingModeHightQuality = QualityModeHight,	//高质量,低速度
 	SmoothingModeNone,	//不消除
 	SmoothingModeAntiAlias, 	//消除锯齿
 }

Graphics类 画多边形

  • 绘制多边形
 //画笔确定颜色与粗细,多个点连接起来形成多边形
 Status DrawPolygon(
IN const Pen *pen,		//画笔
IN const PointF *points, //点的数组
IN INT count	//点的个数
);
  • 填充多边形
//画刷确定填充颜色,多个点连起来形成多边形
Status FillPolygon(
IN Brush *brush,	//画刷
IN const PointF *points, 	//点的数组
IN INT count	//点的个数
)

Graphics类 画饼图

  • 绘制饼图
//画笔确定颜色与粗细,外切矩形确定圆,开始与角度确定饼图
Status DrawPie(
IN const Pen *pen,	//画笔对象
IN const RectF &rect,	//圆的外接矩形
IN REAL	startAngle,		//开始角度
IN REAL sweepAngle		//旋转角度
)
  • 填充饼图
//画刷确定填充颜色,多个点连起来形成多边形
Status FillPie(
IN const Brush *brush,		//画刷
IN const RectF & rect,		//圆的外接矩形
IN REAL	 startAngle,		//开始的角度
IN REAL  sweepAngle			//旋转角度
)

使用纯色画刷填充图形

  • Brush 类

Brush类是定义画刷的抽象基类。画刷对象用于填充图形(矩形,椭圆形,饼图等…)

  • SolidBrush 类
    SolidBrush 类定义一个纯色画刷,继承自Brush类,用于填充图形形状内部,使用一个颜色构造画刷

  • 填充矩形

//画刷填充颜色,矩形确定位置
Status FillRecangle
{
IN const Brush *brush,	//画刷
IN const RectF &rect,	矩形
};
  • 填充椭圆
//画刷填充颜色,外切矩形确定填充椭圆位置
Status FillEllipse(
IN const Brush *brush,	//画刷
IN const RectF &rect
);
  • 填充多边形
 //画刷填充颜色,多个点连起来形成多边形
 Status FillPolygon(
IN	const Brush *brush,		//画刷
IN	const PointF *POINTS,	//点的数组
IN	INT	count		//点的个数
)

使用渐变色画刷填充

  • LinearGradientBrush 类

LinearGradientBrush 类 定义一个绘制颜色渐变的画笔

  • LinearGradientBrush 构造
 			//起点,终点,起点颜色,终点颜色
  LinearGradientBrush(Point &,Point &,Color &,Color&);

LinearGradientBrush (
IN const Rect &rect,	//矩形左上角决定起点,右下角决定终点
IN const Color &color1,//起点颜色
IN const Color &color2,//终点颜色
IN REAL angle,	//角度
IN BOOL	isAngleScalable	//指定角度是否伸缩
);

Graphics类绘制文字

  • 绘制文字
//画刷确定颜色,Font 确定字体,矩形确定范围
Status	DrawString(
IN const WCHAR *string,	//文本
IN INT	length,		//文本长度
IN const Font	*font, //字体对象
IN const PointF &origin, //文字起始点
IN const Brush	*brush	 //画刷对象
)

//画刷确定颜色,Font 确定字体,矩形确定范围
Status	DrawString(
IN const WCHAR *string,	//文本
IN INT	length,		//文本长度
IN const Font	*font, //字体对象
IN const PointF &origin, //文字起始点
IN const StringFormat *stringFormat,//对齐方式
IN const Brush	*brush	 //画刷对象
)
  • Font 类
class Font : public GdiplusBase
{
public:
    friend class Graphics;
        Font(
        IN const WCHAR *           familyName, //字体名
        IN REAL                    emSize, //字体大小
        IN INT                     style   = FontStyleRegular,
        IN Unit                    unit    = UnitPoint,
        IN const FontCollection *  fontCollection = NULL
    );

Graphics类测量字符串

  • 测量字符串
 //画刷确定填充颜色,矩形确定填充位置
 Status MeasureString(
IN const WCHAR *string,		//测量的字符串
IN INT lenght,	//字符串的长度
IN const Font 	*font,  //字体
IN const PointF &origin,//起点坐标
OUT RectF  *boundingBox //测量出来的边界
)

Graphics类绘制图片

  • 绘制图片
    将image对象绘制
Status DrawImage(
IN Image *image,	//要绘制的图像对象
IN const PointF &point	//绘制的左上角
)

```cpp
//将image对象绘制 x,y未绘制起点,width,height指定要绘制的高(可缩放图像)
Status Drawimage(
IN Image	*image,	//要绘制的图像对象
IN REAL x,	//绘制的起点x坐标
IN REAL y,  //绘制的起点y坐标
IN REAL width,	//绘制的宽度
IN REAL height  //绘制的高度
)
成员函数函数功能
FromFile通过一个文件创建Image对象
FromStream通过流创建image对象
GetHeight获取图像的高度
Getwidth获取图像的宽度
Save保存图片对象到文件

Graphics类裁剪与缩放图片

  • 裁剪图片
//将image 对象的部分绘制到指定起始点区域
Status DrawImage(
IN Image *image,	//要绘制的图像对象
IN INT x,		//绘制到窗口的x坐标
IN INT y,		//绘制到窗口的y坐标
IN INT srcx,	//从原图像左上角起始x坐标开始截取
IN INT srcy,	//从原图像左上角起始y坐标开
IN INT srcwidth,	//截取的图像宽
IN INT srcheight,	//截取的图像高
IN Unit srcUnit,	//绘制图像的单位为像素
)
  • 裁剪与缩放
Status DrawImage(
IN Image *image,	//要绘制的图像对象
IN const Rect & destRect,	//绘制到窗口的矩形区域
IN INT srcx,	//从原图像左上角起始x坐标开始截取
IN INT srcy,	//从原图像左上角起始y坐标开
IN INT srcwidth,	//截取的图像宽
IN INT srcheight,	//截取的图像高
IN Unit srcUnit,	//绘制图像的单位为像素
)

)

Graphics类设置缩放插值算法

  • 设置插值模式
    设置此图像对象的插值模式,插值模式决定图像缩放或者旋转使用的算法。
Status	 SetinterpolationMode(
IN interpolationMode interpolationMode	//插值模式
)
  • 插值算法
//其中interpolationModeQualityBicubic 效果最好,对系统资源消耗也最大

enum InterpolationMode
{
	InterpolationModeInvalid,	//插值无效
	InterpolationModeDefault,	//指定默认模式
	InterpolationModeLowQuality,	//指定低质量插值法
	InterpolationModeHeightQuality,	//指定高质量插值法
	InterpolationModeBilinear,		//指定双线性插值法
	InterpolationModeBilcubic,		//指定双三次插值法
	InterpolationModeNearestNeighthbor,	//指定最临近插值法
	InterpolationModeHightQualityBilinear,	//指定高质量双线性插值法
	InterpolationModeHightQualityBilcubic,	//指定高质量双三次插值法
}

Graphics类旋转与扭曲图片

  • 扭曲图片
 //将image对象 通过指定原始图像的左上角,右下角和左下角的坐标可旋转、发射和扭曲图像
 
 Status DrawImage(
 IN Image *image,	//要绘制的图像对象
 IN const Point,	//destPoints,	//点的数组
 IN count,		//点数组个数
);

Graphics 进行平移变换

  • 平移变换
//使用自身和平移矩阵的乘积更改世界转换矩阵
Status TranslateTransform(
	IN REAL dx,		//平移的水平分量
	IN REAL dy,		//平移的垂直分量
	IN MatrixOrder order = matrixOrderPrepend
)
  • 重置平移变换
将世界转换矩阵设置单位矩阵,单位矩阵表示一种什么都不做的转换。

Status ResetTransform();

Graphics 进行缩放变换

  • 缩放变换
//使用自身和平移矩阵的乘积更改世界转换矩阵
Status ScaleTransform(
   IN REAL sx,		//平移的水平分量
   IN REAL sy,		//平移的垂直分量
   IN MatrixOrder order = matrixOrderPrepend
)

Graphics 进行旋转变换

  • 旋转变换
//使用自身和平移矩阵的乘积更改世界转换矩阵
Status RotateTransform(
   IN REAL angle,		//旋转角度
   IN MatrixOrder order = matrixOrderPrepend
)

GDI+的双缓冲绘图

  • 双缓冲技术
    双缓冲原理可形象理解为:把电脑屏幕看作一块黑板,首先我们内存环境建立一个"虚拟"的黑板,然后在黑板上绘制复杂的图形,等图形全部绘制完成,一次性把黑板(内存中)绘制好的图形"拷贝"到电脑屏幕上,这样可以极大提高绘图速度。

  • 双缓冲实现步骤

  • 使用Bitmap创建一个内存位图,位图的大小与窗口区一致,方便拷贝,相当于GDI的CreateCompatbleBitmap。

  • 使用Graphics::FormImage创建内存Graphics对象,相当于GDI的CreateCompatibleDC。

  • 使用Graphics对象成员函数(DrawEllipse,DrawImage等)在内存位图上绘制各种图形

  • 使用Drawimage将内存位图一次性绘制到窗口上

GDI+截取桌面图片

  • 使用GDI+截屏
  • 获取桌面的设备上下文
HDC hsrDC = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL):
HDC GetWindowDC(HWND hWnd) //句柄未NULL时表示全屏幕
  • 创建一个与指定设备兼容的内存设备上下文环境
HDC = hMemDc = CreateCompatibleDC(hsrDC);
  • 为内存兼容DC创建一个尺寸为屏幕大小的内存兼容位图。
//获取屏幕大小
int SX = GetSystemMetrics(SM_CXSCREEN);
int SY = GetSystemMetrics(SM_CYSCREEN)
HBITMAP hBitmap = CreateCompatibleBitmap(hsrDC,SX,SY);
  • 将内存位图选入内存兼容DC中
SelectObject(hMemDc,hBitmap);
  • 将窗口的DC的内容拷贝到内存兼容DC中去,图像自然就画到内存兼容位图上了
BitBlt(hMenDc,0,0,SX,SY,hsrDC,0,0,SRCCOPY);
  • 将HBITMAP转换GDI+的位图Bitmap,并使用
Bitmap bmp(hBitmap,NULL);

代码工程:

  • 0
    点赞
  • 5
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:书香水墨 设计师:CSDN官方博客 返回首页
评论

打赏作者

归途醉染

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值