GDI+学习之路1--准备知识

    从今天开始,根据MSDNGDI+文档正式学习GDI+图形界面编程技术。

GDI+概述:

Microsoft Windows GDI+ Windows XPWindows 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对象实现矩形的渐变色填充。FontStringFormat对象影响到Graphics对象绘制文本的方式。Matrix对象用于存储和生成一个Graphics对象的世界变换矩阵,用于旋转、缩放和翻转图象。

    有些类是主要用作数据类型结构体。这些类中大多数(例如RectPointSize类)作为一般用途。有些则用于特殊用途,被看作是辅助类。例如,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);

        这样便实现了绘图功能。

//以下假设你已经配置好VC6的GDI+环境 1.新建一个基于CScrollView的单文档程序, 2.在stdafx.h内添加如下代码: #ifndef ULONG_PTR #define ULONG_PTR unsigned long* #endif #include "GdiPlus.h" using namespace Gdiplus; #pragma comment(lib,"gdiplus.lib") 3.在GdiApp.h里的CGdiAppApp中加入两个成员: GdiplusStartupInput m_gdiplusStartupInput;// ULONG_PTR m_pGdiToken;// 4.在GdiApp.cpp中的CGdiAppApp构造函数CGdiAppApp()添加如下代码: GdiplusStartup(&m_pGdiToken,&m_gdiplusStartupInput,NULL);// 5.在GdiApp.h里给CGdiAppApp添加一个析构函数~CGdiAppApp(); 6.在GdiApp.cpp中添加CGdiAppApp的析构函数~CGdiAppApp(): CGdiAppApp::~CGdiAppApp()// { GdiplusShutdown(m_pGdiToken);// } 7.在GdiAppView.h的CGdiAppView中添加成员变量: Bitmap* m_pbmp; 并在GdiAppView.cpp中的GdiAppView构造函数和析构函数中添加如下代码: CGdiAppView::CGdiAppView():m_pbmp(0)// { // TODO: add construction code here } CGdiAppView::~CGdiAppView() { delete m_pbmp;// m_pbmp=0;// } 8.按Ctrl+W,在弹出的对话框里选择Message Maps选项卡 class name选择CGdiAppView Object IDs里选中ID_FILE_OPEN 然后在Message里双击COMMAND 弹出的对话框选择Ok 这时会在Member functions:里多出一条刚添加进去的消息映射函数 双击它会自动跳转进入GdiAppView.cpp中的void CGdiAppView::OnFileOpen()函数处 然后添加如下代码: void CGdiAppView::OnFileOpen() { //见源码处 } 9.为了使8处代码有用,还需要: 在GdiAppView.h里添加两个函数声明: int A2U(const char* szA,wchar_t* szU,size_t cnt);// std::wstring A2U(const char* szA);// 并#include 然后在GdiAppView.cpp里加入这两个函数的实现 10.在GdiAppView.cpp中的OnDraw函数中添加显示代码: void CGdiAppView::OnDraw(CDC* pDC) { //见源码处 } 11.结束.有问题联系hastings1986@163.com //可能你Debug版本编译不过,则打开Gdi+头文件GdiPlusBase.h //并修改为如下(其实就加了两个重载版本的new和delete): #ifndef _GDIPLUSBASE_H #define _GDIPLUSBASE_H class GdiplusBase { public: void (operator delete)(void* in_pVoid) { DllExports::GdipFree(in_pVoid); } void* (operator new)(size_t in_size) { return DllExports::GdipAlloc(in_size); } void (operator delete[])(void* in_pVoid) { DllExports::GdipFree(in_pVoid); } void* (operator new[])(size_t in_size) { return DllExports::GdipAlloc(in_size); } //////////////////////////////// void* (operator new)(size_t in_size,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值