GDI+学习---2.GDI+编程模式及组成类
在使用GDI+的时候,您不必像在GDI中那样关心设备场景句柄,只需简单地创建一个Graphics对象,然后以您熟悉的面向对象的方式(如myGraphicsObject.DrawLine(parameters))调用它的方法即可。
Graphics对象是GDI+的核心,与屏幕上的特定窗体有关,他不与Pen、Brush、Image、Path、Font等绑定,只需将这些对象作为参数,传给Graphics类的方法即可。
如画线:
Graphics graphics(*pDC);
Pen pen(Color(255, 255, 0, 0));
graphics.DrawLine(&pen, 0, 0, 100, 100);
GDI+不再拥有当前位置
GDI+绘图与填充方法分离
在GDI+中,绘制矩形边框和填充其内部区域的方法是独立开来的。Graphics 类的DrawRectangle方法有一个参数,用于传入Pen对象的地址。而FillRectangle方法有一个参数,用于传入Brush对象的地址。
GDI+的组成
GDI+ API包含54个类、12个函数、6类(226个)图像常量、55种枚举和19种结构。
1.核心类 Graphics
Graphics(Image* image); // 用于绘制图像
Graphics(HDC hdc); // 用于在当前窗口中绘图(常用)
Graphics(HDC hdc, HANDLE hdevice); // 用于在指定设备上绘制图形
Graphics(HWND hwnd, BOOL icm = FALSE); // 用于在指定窗口中绘图可以进行颜色调整
DrawLine ---- Pen Color PointF
DrawRectangle ---- Pen Rect RectF
DrawEllipse
DrawArc
DrawCurve 基数样条曲线(cardinal spline curve)平滑地通过每个点二没有尖角
DrawBezier
DrawString ---- Font
FillRectangle ---- Brush Rect RectF
清屏
graph.Clear(Color::White);
2.Point、PointF
Size、SizeF
Rect、RectF
3.Color
Color(BYTE a,BYTE r,BYTE g,BYTE b); a:色彩的透明度(0~255)
Color(BYTE r,BYTE g,BYTE b);
4.Pen
5.Brush GdiplusBrush.h
派生类
SolidBrush实心刷
HatchBrush 条纹刷
TextureBrush 纹理刷
LinearGradientBrush 线性渐变刷 // gradient倾斜的,梯度
PathGradientBrush 路径渐变刷
6.文字
Font等
DrawString
7.路径path
8.区域(region)
Region(VOID); // 创建一个空区域
Region(const Rect &rect); // 创建一个整数型矩形区域
Region(const RectF &rect); // 创建一个浮点数型矩形区域
Region(const GraphicsPath *path); // 由图形路径来创建区域
Region(const BYTE *regionData, INT size);// 由(另一)区域的数据构造区域
Region(HRGN hRgn); // 由GDI的区域句柄构造区域
其中,创建矩形区域最简单,由路径创建区域最常用。
9.变换(transform)
Graphics类的3个成员函数
TranslateTransform(REAL dx, REAL dy, MatrixOrder order = MatrixOrderPrepend);
RotateTransform(REAL angle, MatrixOrder order = MatrixOrderPrepend);
ScaleTransform(REAL sx, REAL sy, MatrixOrder order = MatrixOrderPrepend);
其中的最后一个输入参数为矩阵相乘的顺序,取值为矩阵顺序枚举类型MatrixOrder中的符号常量,缺省值都为MatrixOrderAppend(左乘):
typedef enum {
MatrixOrderPrepend = 0, // 矩阵左乘(预先序,前置)
MatrixOrderAppend = 1 // 矩阵右乘(追加序,后缀)
} MatrixOrder;
10.图像
Image类
派生类Bitmap、Metafile
11.图元文件
Metafile类
图元文件中所包含的就是一系列绘图(包括绘制图像)指令及参数,属于矢量图形文件。它所占空间小、可以任意缩放(不会产生马赛克效应),但是绘制图形需要一定的时间。
// 文件型
Metafile(const WCHAR *filename);等
// 流型
Metafile(IStream *stream);等
// DC句柄型
Metafile(HDC referenceHdc, EmfType type = EmfTypeEmfPlusDual, const WCHAR *description = NULL);等
// WMF/EMF句柄型
Metafile(HENHMETAFILE hEmf, BOOL deleteEmf = FALSE);等
其中最简单常用的是:Metafile(const WCHAR *filename);
// 不带DC参数,只能用于打开已经存在的元文件
Metafile mf(L"1.emf");
常用且完整的构造函数是:
Metafile(const WCHAR *fileName, HDC referenceHdc, EmfType type = EmfTypeEmfPlusDual, const WCHAR *description = NULL);
// 带DC参数,只用于创建新图元文件
Metafile mf(L"1.emf", GetDC()->m_hDC, MetafileTypeEmf, L"阴阳鱼");
另一个较为常用的构造函数是:
Metafile(HDC referenceHdc, EmfType type = EmfTypeEmfPlusDual, const WCHAR *description = NULL);
它用于构造内存元文件。这些内存元文件构造函数还有对应的流构造函数版本。
Metafile类的其他成员函数:
// 显示元文件记录,需要与Graphics类的EnumerateMetafile函数及用户自定义的回调函数配套使用(似GDI的)
Status PlayRecord(EmfPlusRecordType recordType, UINT flags, UINT dataSize, const BYTE *data);
// 用于EMF到WMF的转换
static UINT EmfToWmfBits(HENHMETAFILE hemf, UINT cbData16, LPBYTE pData16, INT iMapMode, EmfToWmfBitsFlags eFlags);
// 可用于EMF的SDK函数
HENHMETAFILE GetHENHMETAFILE(VOID);
// 获取元文件头
Status GetMetafileHeader(MetafileHeader *header) const;
static Status GetMetafileHeader(const WCHAR *filename, MetafileHeader *header);
static Status GetMetafileHeader(IStream *stream, MetafileHeader *header);
static Status GetMetafileHeader(HENHMETAFILE *hEmf, MetafileHeader *header);
static Status GetMetafileHeader(HMETAFILE hWmf, const WmfPlaceableFileHeader *wmfPlaceableFileHeader, MetafileHeader *header);
为了将绘图记录保存到图元文件中,需要先创建元文件对象,然后用该图元文件对象再来创建图形对象,最后调用图形类的各种绘图函数来向图元文件中添加绘图记录。
具体方法如下:
1.创建元文件对象
Metafile mf(L"1.emf", GetDC()->m_hDC);//, MetafileTypeEmf, NULL);//带DC创建新的,会清空原图元文件,不能用于图元文件的播放。
2.创建图形对象
//Graphics(Image* image);//Metafile是Image的派生类
Graphics myGraphics(myMetafile);
3.调用各种函数对图元文件添加绘图记录
Pen pen(Color(255, 255, 0, 0));
myGraphics.DrawLine(&pen, 0, 0, 100, 100);
也可以打开已有的图元文件(不带DC参数的构造)Metafile(const WCHAR *filename);再进行绘制
利用Metafile类的成员函数
Status PlayRecord(EmfPlusRecordType recordType, UINT flags,UINT dataSize, const BYTE *data);
来重画图元文件中指定记录
获取当前图元文件的边界矩形:
调用Metafile类的成员函数
Status GetMetafileHeader(MetafileHeader *header) const;
来获取MetafileHeader对象,然后再用MetafileHeader类的成员函数:
void GetBounds(Rect *rect);
得到边界矩形。
GDI+学习---2.GDI+编程模式及组成类的更多相关文章
- Java学习day7面向对象编程1-对象和类
一.Java编程中对象和类的概念 1,什么是类? 答:类是客观存在的,抽象的,概念的东西. 2,什么是对象? 答:对象是具体的,实际的,代表一个事物.例如:车是一个类,汽车,自行车就是他的对象. 关于 ...
- [ExtJS5学习笔记]第六节 Extjs的类系统Class System命名规则及定义和调试
本文地址: http://blog.csdn.net/sushengmiyan/article/details/38479079 本文作者:sushengmiyan ----------------- ...
- VC++学习之GDI概述
VC++学习之GDI概述 图形设备接口(GDI)是一个可执行程序,它接受Windows应用程序的绘图请求(表现为GDI函数调用),并将它们传给相应的设备驱动程序,完成特定于硬件的输出,象打印机输出和屏 ...
- GDI绘图中的映射模式CDC::SetMapMode()
原文链接:http://blog.csdn.net/charlessimonyi/article/details/8264572 在GDI绘图前,一般要设置映射模式.映射模式是什么呢?它是逻辑长度单位 ...
- MXNet设计笔记之:深度学习的编程模式比较
市面上流行着各式各样的深度学习库,它们风格各异.那么这些函数库的风格在系统优化和用户体验方面又有哪些优势和缺陷呢?本文旨在于比较它们在编程模式方面的差异,讨论这些模式的基本优劣势,以及我们从中可以学到 ...
- C# GDI+学习笔记1
前言 本文是学习C# GDI+系列的第一篇文章,简单的介绍了GDI+的一些基本绘图内容,比较粗糙.但本文主要是让大家简单的回顾一下GDI+的基本概念.本篇文章的参考代码请在此下载 . GDIPTes ...
- JAVA学习篇--JAVA两种编程模式控制
在Drp项目中,解说了两种编程模式Model 1和Model2.以下是对这两种模式的简单理解.以及因为Model2是基于MVC架构的模式,就将我们易混淆的MVC与我们之前学的三层架构进行对照学习一下. ...
- 多线程的学习与GDI的学习
今天又是一周的周五,感觉过的好快,我感觉不是期盼周末的到来,而是感觉现在已经习惯啦每天坐在这里敲代码,其实我是一个性格非常开朗的女生,现在不知道为什么感觉默默地坐在自己位置上面敲代码成为了我习以为常的 ...
- GDI+学习---1.初识GDI+
---恢复内容开始--- GDI+: GDI+由一组C++类实现,是对于GDI的继承,GDI+不仅优化了大部分GDI性能而且提供了更多特性.允许应用程序开发者将信息显示在显示器或者打印机上,而无需考虑 ...
随机推荐
- Java基本类型占用字节数(或 bit数)
背景:面试时候问到int类型占用几个字节,以及表示的大小,居然一脸懵逼,任何细节都不能放过. Java基本类型占用字节数(或 bit数) java是跨平台的语言,所以不论在什么系统中这些东西在内存中所 ...
- 2018最完整ITTO分节整理指导(PMP项目管理入门必备)
2018年项目管理基础教材<PMBOK>指南进行了改版,之前的一些PMP资料没有太大帮助,反而会让大家记忆混淆,用最新的会好一些,今天小编就把搜集到的2018年项目管理最详细的ITTO的P ...
- 做IT项目管理也需要具备产品思维
不知道大家有没有听过大胡子姜志辉老师的公开课,我自己认为讲的还是不错的. 因为本身大胡子老师就是一个IT行业的人士,自己还经历了程序员.架构师.项目经理.敏捷教练.产品经理.公司持有人等多个角色.所以 ...
- JS中的toString方法
JS中的所有对象都具有toString方法,它把一个变量隐式转换为字符串 Number类型的对象的toString()方法比较特殊,有默认模式和基模式两种 默认模式: 无论我们用什么表示法声明数字变量 ...
- Luogu P3239 [HNOI2015]亚瑟王
题目链接 \(Click\) \(Here\) 期望神题.最开始一直尝试推朴素一点的,逻辑上的\(DP\)式子,后来发现一直出锅,可能是我的式子没容斥对... 题解中给出的想法是这样的: 首先,如果直 ...
- (贪心和优先队列) POJ1862 Stripies
Stripies Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 21506 Accepted: 9478 Descrip ...
- SQL语法基础之DELETE语句
SQL语法基础之DELETE语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查看帮助信息 1>.查看DELETE的帮助信息 mysql> ? DELETE Na ...
- XenServer中虚拟机和快照导出与导入
我们在工作中经常会遇到,把Xenserver中的虚拟机或者快照导出,然后导入到另一台Xenserver,或者导出来备份下来,以防虚拟机出现故障. 下面介绍一下用xe命令如何导出/导入虚拟机或快照,当然 ...
- 网络编程基础【day10】:操作系统介绍
一.为什么要有操作系统 现代的计算机系统主要是由一个或者多个处理器,主存,硬盘,键盘,鼠标,显示器,打印机,网络接口及其他输入输出设备组成. 一般而言,现代计算机系统是一个复杂的系统. 其一:如果每位 ...
- 4.Zuul-限流
令牌桶 限流流程图: RateLimitFilter : package com.wangfajun.filter; import com.alibaba.fastjson.JSON; import ...