在使用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+编程模式及组成类的更多相关文章

  1. Java学习day7面向对象编程1-对象和类

    一.Java编程中对象和类的概念 1,什么是类? 答:类是客观存在的,抽象的,概念的东西. 2,什么是对象? 答:对象是具体的,实际的,代表一个事物.例如:车是一个类,汽车,自行车就是他的对象. 关于 ...

  2. [ExtJS5学习笔记]第六节 Extjs的类系统Class System命名规则及定义和调试

    本文地址: http://blog.csdn.net/sushengmiyan/article/details/38479079 本文作者:sushengmiyan ----------------- ...

  3. VC++学习之GDI概述

    VC++学习之GDI概述 图形设备接口(GDI)是一个可执行程序,它接受Windows应用程序的绘图请求(表现为GDI函数调用),并将它们传给相应的设备驱动程序,完成特定于硬件的输出,象打印机输出和屏 ...

  4. GDI绘图中的映射模式CDC::SetMapMode()

    原文链接:http://blog.csdn.net/charlessimonyi/article/details/8264572 在GDI绘图前,一般要设置映射模式.映射模式是什么呢?它是逻辑长度单位 ...

  5. MXNet设计笔记之:深度学习的编程模式比较

    市面上流行着各式各样的深度学习库,它们风格各异.那么这些函数库的风格在系统优化和用户体验方面又有哪些优势和缺陷呢?本文旨在于比较它们在编程模式方面的差异,讨论这些模式的基本优劣势,以及我们从中可以学到 ...

  6. C# GDI+学习笔记1

    —前言 本文是学习C# GDI+系列的第一篇文章,简单的介绍了GDI+的一些基本绘图内容,比较粗糙.但本文主要是让大家简单的回顾一下GDI+的基本概念.本篇文章的参考代码请在此下载 . GDIPTes ...

  7. JAVA学习篇--JAVA两种编程模式控制

    在Drp项目中,解说了两种编程模式Model 1和Model2.以下是对这两种模式的简单理解.以及因为Model2是基于MVC架构的模式,就将我们易混淆的MVC与我们之前学的三层架构进行对照学习一下. ...

  8. 多线程的学习与GDI的学习

    今天又是一周的周五,感觉过的好快,我感觉不是期盼周末的到来,而是感觉现在已经习惯啦每天坐在这里敲代码,其实我是一个性格非常开朗的女生,现在不知道为什么感觉默默地坐在自己位置上面敲代码成为了我习以为常的 ...

  9. GDI+学习---1.初识GDI+

    ---恢复内容开始--- GDI+: GDI+由一组C++类实现,是对于GDI的继承,GDI+不仅优化了大部分GDI性能而且提供了更多特性.允许应用程序开发者将信息显示在显示器或者打印机上,而无需考虑 ...

随机推荐

  1. File类三种得到路径的方法

    转: File类三种得到路径的方法 2010年11月29日 20:37:00 ssyan 阅读数:27123 标签: filemicrosoftstringexceptionwindowsunix   ...

  2. jQuery、layer实现弹出层的打开、关闭功能实例详解

    本文主要介绍了jQuery.layer实现弹出层的打开.关闭功能,需要的朋友可以参考下,希望能帮助到大家. 打开弹出层: 在list页面带入layer.js 在list页面点击时,弹出form弹出层, ...

  3. VMware for mac inside error solutions

    Terminal 下执行 sudo xattr -r -d com.apple.quarantine /Applications/VMware\ Fusion.app 之后就能正常打开镜像安装虚拟机了 ...

  4. (贪心 部分背包问题)悼念512汶川大地震遇难同胞——老人是真饿了 hdu2187

    悼念512汶川大地震遇难同胞——老人是真饿了 http://acm.hdu.edu.cn/showproblem.php?pid=2187 Time Limit: 1000/1000 MS (Java ...

  5. Ajax的请求规范(二)

    第一种方式:send()不带参数 function doAjax(url,fnSucc,fnFaild) { //1.创建Ajax对象 if (window.XMLHttpRequest) {//判断 ...

  6. java bio总结

    .同步异步.阻塞非阻塞(目前不是很清楚,这篇博客写完后,后续进行处理) 1.同步和异步:关注的是消息的通讯机制, 同步:发起调用后,如果没有得到结果,该调用是不会返回的:该调用者会主动等待调用返回. ...

  7. 面向对象【林老师版】:特性(property)(十六)

    一.什么是特性property property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 例一:BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成 ...

  8. 获取spring上下文的bean 工具类

    有些场景我们不属于controller,service,dao,但是我们需要从spring中得到spring容器里面的bean.这时候我们需要一个类继承 ApplicationContextAware ...

  9. .net导出Excel几种方式比较

    数据原共400条数据,21列,我是双核cpu,4G内存1. Excel com组件要3秒左右,上千条30秒+这种方法比较慢,要引用Microsoft.Office.Interop.Excel #reg ...

  10. Lost connection to MySQL server during query,MySQL设置session,global变量及网络IO与索引

    Navicat导出百万级数据时,报错:2013 - Lost connection to MySQL server during query 网上一番搜索,修改mysql如下几处配置文件即可: sel ...