GDI+准备知识

从今天开始,根据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);

        这样便实现了绘图功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值