从今天开始,根据MSDN中GDI+文档正式学习GDI+图形界面编程技术。
GDI+概述:
Microsoft Windows GDI+ 是Windows XP和Windows Server 2003操作系统的子系统,它负责在屏幕和打印机上显示信息。GDI+是一个应用程序编程接口(API),它由一组C++类实现。基于Microsoft Win32的应用程序不能直接访问图形硬件,而是通过GDI+来协调设备驱动和程序动作的交互。GDI+同样支持Microsoft Win64。
顾名思义,GDI+是对于GDI的继承,后者包含于早期的Windows版本中。Windows XP 或者 Windows Server 2003支持GDI以保持对现有程序的兼容性,但是编写新程序的开发者应该使用GDI+来实现他们所有的图形需求,因为GDI+不仅优化了大部分GDI性能而且提供了更多特性。
一个图形设备接口,比如GDI+,允许应用程序开发者将信息显示在显示器或者打印机上,而无需考虑该显示设备的详细情况。应用程序开发者调用GDI+类所提供的方法,而这些方法又依次适当的调用特定设备驱动程序。GDI+使得应用程序和图形硬件隔离开来,得益于此,开发者因而可以创建设备无关的应用程序。
GDI+的三个组成部分
二维矢量图形
矢量图形由图元(比如线条、曲线和图形)组成,它们由一系列坐标系统的点集组成。例如,一条直线可以由它的两个端点所确定,一个矩形可以通过给出它的左上角点的位置加上它的宽度、高度来确定。一个简单的路径可以由一个由直线连接而成的点数组来描述。一条贝塞尔样条是一个由4个控制点所描述的高级曲线。
GDI+提供了用于存储这些图元本身信息的类、如何绘制这些图元信息的类以及实际绘制这些图元的类。例如,Rect类存储一个矩形的尺寸位置;Pen类存储线条颜色、线条宽度以及线条样式等信息;而Graphics类则提供绘制线条、矩形、路径和其他图形的方法。同时,有几个Brush类还用于存储有关闭合图形和路径内部填充颜色和图案的信息。
图像
某些图片很难或者不可能采用矢量图形技术来显示。比如,工具栏按钮图片和图标就很难通过一系列线条和曲线来描述。一张拥挤的棒球馆的高分辨率的数码照片更难采用矢量技术来创建。这种类型的图象采用位图进行存储,即由表示屏幕上独立点的颜色的数字型数组所组成。用于存储位图信息的数据结构往往比矢量图形要复杂的多,因此出于此种原因GDI+中提供了好几种类。类似的类比如CachedBitmap,用于存储一张内存图片,供快速存取和显示用。
排版
排版关系到多种字体、尺寸和样式文字的显示。GDI+提供给人深刻印象数量的对这项复杂的任务的支持。新的特性中包括了子象素抗锯齿功能,它使得在液晶显示屏上可以显示更加平滑的显示文本。
基于类的接口架构
Microsoft Windows GDI+包含大约40个类、50个枚举和6个结构体。同时也有少数几个函数不属于任何类。Graphics类是整个GDI+接口的核心;它是实际进行线条、曲线、图形、图象和文本绘制的类。
多数类和Graphics类配合使用。例如,Graphics::DrawLine方法接受一个Pen对象,该对象保存了即将绘制的线条的属性(颜色、宽度、虚线类型及其他)。Graphics::FillRectangle方法接受一个LinearGradientBrush对象,该对象协同Graphics对象实现矩形的渐变色填充。Font和StringFormat对象影响到Graphics对象绘制文本的方式。Matrix对象用于存储和生成一个Graphics对象的世界变换矩阵,用于旋转、缩放和翻转图象。
有些类是主要用作数据类型结构体。这些类中大多数(例如Rect、Point和Size类)作为一般用途。有些则用于特殊用途,被看作是辅助类。例如,BitmapData类是Bitmap类的辅助类,PathData类是GraphicsPath类的辅助类。GDI+同时定义了少数几个结构体用于组织数据。例如,ColorMap结构体存储一对颜色对象,构成了一个颜色转换表的入口项目。
在MFC中使用GDI+
在默认情况下MFC中绘图并不是GDI+的,需要自己进行一些简单的设置才可以使用GDI+
设置方法如下:(以单文档程序为演示)
一、引入头文件
我们需要手动引入GDI+的头文件和库,引用方法:
在stdafx.h文件中添加如下几行:
#include <GdiPlus.h>
using namespace Gdiplus;
#pragma comment(lib,"gdiplus.lib")
二、全局变量设置
在APP类中(CXXXApp类),添加成员变量ULONG_PTR m_ptrToken;此变量用于GDI+的控制
三、初始化GDI+对象
在App类初始化函数InitInstance()中添加:
GdiplusStartupInput gsi;
GdiplusStartup(&m_ptrToken,&gsi,NULL);
用于进行GDI+的初始化
四、扫尾工作
到目前为止,已经可以正常使用GDI+了,但是考虑周全些,我们还需要在程序结束时关闭GDI+的调用,
所以我们在程序析构函数CHitTestApp::~CHitTestApp()中添加
GdiplusShutdown(m_ptrToken);
完成析构工作
在OnDraw函数使用GDI+来绘图:
Graphics graphics(this->GetDC()->m_hDC);
Pen pen(Color(255, 0, 0, 255));
graphics.DrawLine(&pen, 0, 0, 100, 100);
这样便实现了绘图功能。