第5章 GDI+图形设备接口加
c++第5章 图形绘制
第5章图形绘制在Visual C++6.0中,掌握图形程序设计方法是非常重要的。
因为图形在任何一个可视化工程项目中都是不可缺少的。
CDC(设备环境)类封装了图形绘制所需要的各种操作。
本章我们将通过实际例子和较详细的阐述,来了解和掌握如何使用设备环境类(CDC)及图形设备接口(GDI)进行图形绘制。
5.1 设备环境与设备环境类(CDC)5.1.1 设备环境设备环境也称设备上下文(Device Context,简称DC),是计算机物理设备的代表,也是图形设备接口的主要组成部分。
由于Windows是一个与设备无关的操作系统,即Windows不允许直接访问硬件,如果用户想将文本和图形绘制到显示器或其它设备中去,必须通过“设备环境”这个抽象层与硬件进行通信,设备上下文对象的作用就是实现Windows的设备无关性,任何向屏幕上进行输出的功能都要间接地通过它来完成。
设备上下文是Windows的一种数据结构,它包含了有关如显示器或打印机等设备的绘图属性信息。
所有绘画都是通过设备上下文对象来实现的,该对象封装了Windows的画线、图形和文本的API函数。
设备上下文允许在Windows下独立于设备的绘画。
设备上下文不仅能够被用来在屏幕上绘画,它也可以将绘画输出到打印机和图元文件中。
5.1.2 设备环境类设备环境类CDC直接继承于CObject类,该类定义了一类设备对象。
CDC对象提供了非常多的成员函数,与设备环境的显示器、打印机等一起工作。
例如,如果要在显示器等设备上绘制图形,我们可以用MFC提供的设备环境类CDC类,因为CDC类中包含了绘图所需要的所有成员函数。
同时。
MFC还提供了以下几个CDC的派生类:1、CPaintDC类此类比较特殊,它的构造函数和析构函数都是针对OnPaint进行的。
用户一旦获得相关的CDC指针,就可以将它当做任何设备环境(包括屏幕、打印机)指针来使用,CPaintDC类的构造函数会自动调用BeginPaint,而它的析构函数则会自动调用EndPaint。
图形设备接口及绘图
§3.2 图形设备接口(GDI)
1. 图形设备接口—提供专门的数据结构即设备描述表(DC)和对DC操 作的绘图函数。
2. 设备描述表(DC)—用于代表图形输出设备如显示屏、打印机;
3. 设备无关性—利用GDI,所有的绘图操作都对设备描述表而不是具体 的物理设备。
设备描述表
• 一种专门用于代表图形输出设备(如屏幕、打 印机和绘图仪等)的数据结构 –画布 –绘图工具(设备描述表属性)
hNewPen=(HPEN)SelectObject(hdc,hOldPen); DeleteObject(hNewPen); EndPaint(hWnd, &ps); break;
使用CGDIObject类
• 数据成员m_hObject • Attach函数 Detach函数 • 派生类: CPen、CBrush、CFont、
– yViewport=(yWindowyWinOrg)*(yViewExt/yWinExt)&ewportOrgEx函数
BOOL SetViewportOrgEx( HDC hdc, // 设备描述表句柄 int X, // 使用设备单位,视口原点的X坐标值 int Y, // 使用设备单位,视口原点的Y坐标值 LPPOINT lpPoint // 指向POINT结构变量,存放 原始的视口原点坐标
PAINTSTRUCT • typedef struct tagPAINTSTRUCT {
HDC hdc; BOOL fErase; RECT rcPaint; BOOL fRestore; BOOL fIncUpdate; BYTE rgbReserved[32]; } PAINTSTRUCT
(2) EndPaint function
第5章 VC++图形和文本输出
5.画多边形 CPoint poly[4];//画一个平行四边形 poly[0]=CPoint(0,0); poly[1]=CPoint(50,50); poly[2]=CPoint(50,100); poly[3]=CPoint(0,50); pDC->Polygon(poly,4);
6.画其它图形 CDC::Pie 画饼图 CDC::Chord 画弦 CDC::FillRect 用指定颜色填充矩形且不画 边线 CDC::Draw3DRect 用于绘制名种3D边框 CDC::RoundRect 画圆角矩形
// TODO: add draw code for native data here
pDC->TextOut(1,1,”hello world!”);
}
WM_PAINT消息
WM_PAINT消息是最重要的绘图消息, 它要求窗口重新绘制内容,产生 WM_PAINT消息的场合通常有: 窗口移动后及最大化,最小化后的刷新。 被覆盖区域的刷新,如下拉菜单覆盖的区 域。 无效区域产生后的刷新,如执行滚动条操 作,将一区域移动至不可见。
设备上下文类-CDC
CObject CDC CClientDC CMetaFileDC CPanitDC CWindowDC
设备上下文类-CDC
MFC封装了DC,提供CDC类及它的子类以 访问GDI。 各类操作如下: 1.CDC类 该类封装了所有图形输出函数,包含一个 DC的创建和初始化及通用GDI对象的操作, 其中包括画简单图形(如线、矩形、椭圆)和 进行复杂功能(区域、位图)
设置字体 (Set Font)
设置显示字体的风格需要创建一个CFont对 象,步骤如下: 1.定义CFont对象 2.调用CreateFont函数创建字体 3.将创建的字体对象选入DC,并保存前一 个被选入DC的字体对象 程序举例Exam4:在视图中创建并使用字体, 显示“倾斜的黑体”内容。
GDIGDI+使用到的相关函数介绍
GDIGDI+使⽤到的相关函数介绍GDI,图像设备接⼝的简称。
⾸先介绍⼏个概念。
1、DC,设备上下⽂DeviceContext,也称为设备描述表。
它是⼀个关于如何绘制图形的⽅法集合,既可以绘制各种图形,也可以确定在应⽤窗⼝中绘制图形的⽅式,即绘图模式和映射模式。
Win32编程中使⽤HDC来标识。
DC类似于画布,我们想要绘制图形⾸先就需要获得DC。
常见获得DC的⽅法HDC hdc = ::GetDC(hwnd);::ReleaseDC(hwnd,hdc);此⽅法适合在窗⼝现有图形的基础上进⾏绘制。
(获得DC后⼀定要记得Release,否则会造成内存泄漏)PAINTSTRUCT ps;HDC hdc = ::BeginPaint(hWnd,&ps);::EndPaint(hWnd,&ps);BeginPaint函数就是将窗⼝上所有内容清除⼲净,然后在上⾯绘制。
参数ps可以指定更新的区域,⽽不必重绘制整个界⾯, BeginPaint和EndPaint总是被⽤来响应WM_PAINT 消息。
HDC hMemDC = ::CreateCompatibleDC(hDest);//其他绘图操作代码::BitBlt(hDest,x,y,w,h,hMemDC,0,0,SRCCOPY);//将hMemDC上绘制的图像数据拷贝到hDest上,界⾯此时才会显⽰::DeleteDC(hMemDC);通过调⽤CreateCompatibleDC函数来创建与⽬标DC兼容的内存DC,⼀般⽤于解决界⾯的闪烁问题。
2、常⽤的GDI对象画笔Pen:负责画线,画边框(矩形边框,圆边框,饼边框)都是采⽤画笔来操作的。
默认画笔是⿊⾊,宽度为1,样式为实线的画笔。
画刷Brush:负责填充矩形,填充圆、饼等以及刷窗⼝背景。
默认为⽩⾊画刷。
字体Font:负责基于具体字体对象的所有的⽂本绘制,默认字体是系统等宽字体,⽐如对话框标题。
图形设备接口及绘图
设备驱动层负责与具体的图形设 备进行交互,将GDI核心层发送的 图形指令转换为设备可以理解的 指令,并控制设备进行渲染。
GDI的结构主要包括三个层次:应 用程序接口层、GD负责将应用程序的图形 操作转换为相应的图形指令,并 管理图形设备的资源,如内存、 颜色表等。
技术创新方向预测
跨平台兼容性增强
随着不同操作系统和设备的普及,图形设备接口将更加注重跨平 台兼容性,实现无缝的跨平台用户体验。
实时渲染技术优化
借助更强大的计算能力和先进的算法,图形设备接口将进一步提高 实时渲染的质量和效率。
AI驱动的智能图形处理
结合人工智能技术,图形设备接口将实现更智能的图形处理,包括 自动优化、智能缩放、场景识别等功能。
图形设备接口及绘图
目录
• 图形设备接口概述 • 图形设备接口原理及结构 • 绘图基本操作与功能 • 高级绘图技巧与方法 • 图形设备接口在应用领域中的实践 • 图形设备接口未来发展趋势与挑战
01 图形设备接口概述
定义与功能
定义
图形设备接口(Graphics Device Interface,GDI)是一种应用程序编 程接口(API),用于在计算机图形环 境中表示图形和文字。
标准
为了规范GDI的开发和使用,国际标准化组织(ISO) 和国际电工委员会(IEC)等制定了一系列相关标准, 如OpenGL、DirectX等。这些标准为不同平台和设 备上的GDI实现提供了统一的接口和规范,促进了 GDI的互操作性和可移植性。
02 图形设备接口原理及结构
工作原理简介
图形设备接口(GDI)是计算机图形学中的一个重要概念, 它提供了一种与图形硬件设备进行交互的抽象层。
图像处理
反走样技术
图形设备接口培训课件
图形设备接口培训课件概述本课程旨在介绍图形设备接口(Graphics Device Interface,GDI)的基本概念、功能和使用方法。
GDI是一种用于在Microsoft Windows操作系统中绘制图形和文字的API。
通过学习本课程,您将了解GDI的基本原理、常用功能以及如何使用GDI在Windows应用程序中创建绘图和文字。
目录•GDI简介•GDI对象•绘制图形–直线和曲线–矩形和圆角矩形–椭圆和圆–多边形•绘制文字•图像操作•设备上下文•GDI+和Direct2DGDI简介GDI是Windows操作系统中的图形设备接口,它提供了一系列的函数和数据结构,用于在屏幕上绘制图像和文字。
GDI使用设备上下文(Device Context)来管理图形输出的相关信息,包括画笔、画刷、字体等。
在使用GDI之前,需要先创建一个设备上下文,并将其与屏幕或打印机连接起来。
GDI对象在GDI中,图形元素和属性都被封装为对象。
常用的GDI对象包括画笔、画刷、字体和位图等。
这些对象可以通过GDI的函数进行创建、设置属性和使用,也可以通过GDI的函数进行销毁。
绘制图形GDI提供了多种绘制图形的函数,可以绘制直线、曲线、矩形、椭圆、圆和多边形等图形。
绘制图形的过程通常包括选择绘图对象、设置绘制属性和调用相应的绘制函数。
直线和曲线GDI提供了MoveToEx和LineTo函数用于绘制直线。
MoveToEx函数用于设置直线的起始点,LineTo函数用于设置直线的终点并绘制直线。
GDI还提供了绘制曲线的函数,如Polyline、PolyBezier和PolyBezierTo等。
这些函数可以根据给定的点坐标绘制连接它们的曲线。
矩形和圆角矩形GDI提供了Rectangle函数用于绘制矩形。
这个函数接受矩形的左上角和右下角坐标作为参数,并在指定的区域内绘制一个矩形。
RoundRect函数可以绘制带有圆角的矩形。
这个函数除了接受矩形的左上角和右下角坐标外,还接受一个椭圆的宽度和高度作为参数,用于指定圆角的大小。
第5章C++ Windows绘图
5.3.1 画笔的应用
创建画笔最简单的方法是调用CPen类的一个带参 数的构造函数来构造一个CPen类画笔对象,它可 以定义笔的虚实、颜色和笔宽。具体使用步骤如 下: (1)生成CPen类的对象。 (2)调用CPen类的函数CreatePen()创建一支新 画笔,CreatePen()函数的原型是:
5.4.1 与绘图相关的数据类型
2.CRect类和RECT结构 CRect类等同于RECT结构,它用top、left、bottom、 right成员来定义一个矩形区域,RECT的形式是: typedef struct tagRECT { LONG left; LONG top; LONG right; LONG bottom; } RECT;
5.1.2 图形刷新
3.刷新方法 常用的Windows应用程序刷新窗口的方法如下: 在内存中保持一个显示输出的副本,当需要重绘 窗口时,将副本拷贝到相应的窗口中。该方法适 用于刷新位图等复杂图形。 记录曾经发生的事件,在窗口需要刷新时重新调 用窗口执行这个事件。 重新绘制图形,一般对于简单图形常采用重新绘 制图形方法执行刷新。在应用程序中,将图形绘 制处理程序放在消息WM_PAINT的响应模块中, 一旦程序接收到刷新请求即可重绘图形。
5.3.2 画刷的应用
在MFC类库中,CBrush类封装了GDI的画刷工具。 在定义画刷对象时,要调用构造函数来创建默认的 画刷。使用画刷的主要步骤为: (1)生成CBrush类对象,并调用构造函数初始化画 1 CBrush 刷。 (2)用CDC类的SelectObject()函数,把新画刷选 入设备环境。 (3)使用完新画刷后,用CDC类的SelectObject() 函数恢复原有画刷。
5.1.1 基本概念
图形设备接口
图形设备接口学前提示Windows中负责图形输出的是图形设备接口GDI(Graphic Device Interface)。
GDI通过将应用程序与不同的输出设备特性相隔离,使Windows应用程序能够无须修改即可在Windows支持的任何图形输出设备上运行,即具有设备无关性。
本章主要介绍图形设备接口的知识——设备描述表,坐标系统,映射模式,绘图函数和绘图工具知识要点设备上下文坐标的映射绘制基本图形创建画笔设备上下文类为了支持GDI绘图,MFC提供了两种重要的类设备上下文类,包括CDC及其派生类,用于设置绘图属性和绘制图形绘图对象类,封装了各种GDI绘图对象,包括画笔,画刷,字体,位图,调色板和区域等设备上下文类包括CDC类和它的派生类CClientDC,CPaintDC,CWindowDC ,CMetaFileDC。
表7.1 CDC 类的一些常用函数7.2 坐标的映射坐标的映射方式简单地讲就是坐标的安排方式,系统默认的映射模式为MM_TEXT,即X坐标向右增加,Y坐标向下增加,(0,0)在屏幕左上方,DC中的每一点就是屏幕上的一个象素,如图7.3所示。
如语句pDC->Rectangle(CRect(0,0,300,300))表示将绘制出一个矩形,这个矩形的左上角落在屏幕的左上方,长和宽均为300 个象素屏幕坐标X 坐标向右增加7.2.1 设置映射模式用户可以通过int CDC::SetMapMode( int nMapMode) 指定映射模式,映射模式从X轴和Y 轴的比例是否可变来说,可分为固定映射模式和可变比例映射模式两类(1)固定比例映射模式,其具体值如表7.2 所示上述几种映射默认的原点在屏幕左上方,(2)可变比例映射模式7.3 绘制基本图形CDC类在它的成员函数中封装了全部Windows 图形API ,这些成员函数包括—画点的函数,画线的函数,画形状的函数,填充和翻转形状的函数,滚动屏幕的函数,绘制文本的函数,绘制位图和图表的函数7.3.1 画点画点即在指定的坐标处按给定的颜色画出像素点,点的绘制不过是改变单个像素点的颜色。
gdi+ 原理
gdi+ 原理GDI(Graphics Device Interface)是Windows操作系统中用于图形输出的接口。
它是Microsoft公司开发的一种图形处理标准,用于在Windows操作系统中实现各种图形设备和应用程序的图形输出。
在计算机科学中,GDI是一种非常常见的图形编程接口,它提供了一种方便的方式来访问各种图形设备和应用程序中的图形数据。
一、GDI的组成GDI主要由以下几个部分组成:1. 设备上下文(DC):设备上下文是GDI中的一个重要概念,它代表了一个特定的输出设备,如屏幕、打印机等。
在GDI中,设备上下文包含了与输出设备相关的各种信息,如分辨率、颜色格式等。
2. 画笔(Pen):画笔是GDI中的一个工具,它允许开发者在设备上下文中绘制各种形状和线条。
画笔包含了颜色、宽度、样式等属性。
3. 刷子(Brush):刷子是GDI中的另一个工具,它允许开发者在设备上下文中绘制填充。
刷子包含了颜色、粗细等属性,以及一个位图来表示实际的填充图案。
4. 字体(Font):字体是GDI中用于文本输出的一个重要概念。
开发者可以通过指定字体、大小、样式等属性来输出文本。
5. 区域(Region):区域是GDI中的一个概念,它允许开发者对设备上下文中的某个区域进行操作,如绘制、剪裁等。
区域由一组路径和形状组成,可以通过GDI的API进行操作。
二、GDI的工作原理GDI通过调用各种绘图函数来操作设备上下文,从而实现图形的输出。
这些绘图函数包括画线、填充、文本输出等。
开发者可以通过GDI提供的API来创建、使用和管理这些绘图函数。
GDI的工作原理可以分为以下几个步骤:1. 创建设备上下文:开发者首先需要创建一个设备上下文对象,指定输出设备的属性,如分辨率、颜色格式等。
2. 创建画笔和刷子对象:根据需要,开发者可以创建画笔和刷子对象,并设置它们的属性。
3. 调用绘图函数:开发者通过调用GDI提供的绘图函数,将画笔和刷子应用到设备上下文中,从而实现图形的输出。
C#程序设计案例教程第 5 章 GDI +图像编程
上一页 下一页
返回
5.1
GDI + 绘图基础
• 方法三: 调用 Graphics 类的 FromImage 静态方
法
• 由从 Image 继承的任何对象创建 Graphics 对象。 在
需要更改已存在的图像时, 通常会使用此方法。
• 1.Graphics 类的方法成员
public Pen(Color);
用指定的画刷实例化一支画笔的方法如下:
public Pen(Brush);
上一页 下一页
返回
5.1
•
•
•
•
•
•
•
•
•
GDI + 绘图基础
用指定的画刷和宽度实例化一支画笔的方法如下:
public Pen(Brush,float);
用指定的颜色和宽度实例化一支画笔的方法如下:
• public Rectangle(int,int,int,int);
• 6.Point 结构
• 用指定坐标初始化 Point 类的新实例。 这个结构很像 C ++
中的 Point 结构, 它描述了一对有序的 x, y 两个坐标值,
其构造函数为: public Point(int x, int
y);, 其中 x 为该点的水平位置; y 为该点的水垂直位置。 下
这套类被称为 GDI + 的 “托管类接口”。 GDI + 主要提供了
以下三类服务:
• ①二维矢量图形: GDI + 提供了存储图形基元自身信息的类 (或
结构体)、 存储图形基元绘制方式信息的类以及实际进行绘制的类。
• ②图像处理: 大多数图片都难以划定为直线和曲线的集合, 无法使
VC15_13GDI+ 图形编程
Custom
用户定义的线条样式
5.2.1 画笔Pen类
在创建Pen对象时,可以用指定的颜色或Brush对象来初始化Pen类的新实例, 并且还可以为画笔指定线条的宽度,默认宽度为1个像素。例如:
Pen^ pen1 = gcnew Pen(Color::Red); // 默认宽度为1个像素的红色画笔 Pen^ pen2 = gcnew Pen(Color::Blue, 2); // 宽度为2个像素的蓝色画笔 Pen^ pen3 = gcnew Pen(Brushes::Gray);// 具有灰色画刷属性的1个像素宽的画笔 Pen^ pen4 = gcnew Pen(Brushes::Black, 5);// 具有黑色画刷属性的5个像素框的画笔 pen4->DashStyle = DashStyle::Dash; // 虚线
5.2 绘图基础
5.2.1 使用GDI+的一般方法 在Windows窗体应用程序中,窗体和控件常常需要绘制自己,以维持 其界面的外观,此时就会引发Paint事件,在该事件的处理方法中添加代 码就可实现相应的绘图操作。
::Void On_Paint(System::Object^ sender,System::Windows::Forms::PaintEventArgs^ e) e有两个重要属性:
5.2.1 画笔Pen类
DashStyle属性则指定了虚线的样式,其值是由System::Drawing::Drawing2D命 名空间中的DashStyle枚举指定的。DashStyle枚举中的成员及对应的画笔样式如表 5.3所示。
画笔样式 Solid Dash Dot DashDot DashDotDot 描 述 实线风格 虚线风格 点线风格 点画线风格 双点线风格 图 例
什么是GDI+?
什么是GDI+?什么是GDIGDI是Graphics Device Interface的缩写,含义是图形设备接口,它的主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出。
在Windows操作系统下,绝大多数具备图形界面的应用程序都离不开GDI,我们利用GDI所提供的众多函数就可以方便的在屏幕、打印机及其它输出设备上输出图形,文本等操作。
GDI的出现使程序员无需要关心硬件设备及设备驱动,就可以将应用程序的输出转化为硬件设备上的输出,实现了程序开发者与硬件设备的隔离,大大方便了开发工作。
1.引言GDI+是Windows XP中的一个子系统,它主要负责在显示屏幕和打印设备输出有关信息,它是一组通过C++类实现的应用程序编程接口。
顾名思义,GDI+是以前版本GDI的继承者,出于兼容性考虑,Windows XP仍然支持以前版本的GDI,但是在开发新应用程序的时候,开发人员为了满足图形输出需要应该使用GDI+,因为GDI+对以前的Windows版本中GDI进行了优化,并添加了许多新的功能。
作为图形设备接口的GDI+使得应用程序开发人员在输出屏幕和打印机信息的时候无需考虑具体显示设备的细节,他们只需调用GDI+库输出的类的一些方法即可完成图形操作,真正的绘图工作由这些方法交给特定的设备驱动程序来完成,GDI+使得图形硬件和应用程序相互隔离.从而使开发人员编写设备无关的应用程序变得非常容易。
2.GDI+新增功能(1)渐变的画刷(Gradient Brushes)GDI+允许用户创建一个沿路径或直线渐变的画刷,来填充外形(shapes),路径(paths),区域(regions),渐变画刷同样也可以画直线、曲线、路径,当你用一个线形画刷填充一个外形(shapes)时,颜色就能够沿外形逐渐变化。
(2)基数样条函数(Cardinal Splines)GDI+支持基数样条函数,而GDI不支持。
【Windows编程】系列第五篇:GDI图形绘制
【Windows编程】系列第五篇:GDI图形绘制上两篇我们学习了以及,知道如何⽤常见Win32输出⽂本字符串,这⼀篇我们来学习Windows编程中另⼀个⾮常重要的部分GDI图形绘图。
Windows的GDI函数包含数百个API可供我们使⽤,本篇把最常⽤的GDI绘图做⼀个讲解。
GDI可以绘制点、直线曲线、填充封闭区域、位图以及⽂本,其中⽂本部分已经在上⼀篇中将了,请参考。
跟前⾯的GDI对象⼀样,本篇的这些绘图函数也必须要设备上下⽂句柄(HDC)作为函数参数,从前⽂我们知道,HDC可以在处理WM_PAINT的时候⽤BeginPaint函数获取,也可以从GetDC、GetWindowDC拿到。
既然是画图,就少不了颜⾊的描述,Windows中的颜⾊有⼏种表⽰,其中COLORREF在GDI绘制中⽤的最多,它实际上是⼀个⽆符号32为整型。
其中红、绿、蓝各占⼀个字节,最⾼字节不使⽤,如下图所⽰:该值可以⽤Windows提供的RGB宏来⽣成,Windows中RGB的定义为:#define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))除此之外,Windows还有结构体RGBQUAD也表⽰颜⾊,这种⼀般⽤于位图结构信息中。
画像素点Windows提供了SetPixel和GetPixel函数来设定和获取像素点的颜⾊。
函数原型为:COLORREF SetPixel(HDC hdc, int X, int Y, COLORREF crColor);COLORREF GetPixel(HDC hdc, int nXPos, int nYPos);该函数并不常使⽤。
画笔画刷在图形绘制之前,可以创建画笔给后续的画图使⽤,创建画笔的API函数为:HPEN CreatePen(int fnPenStyle, int nWidth, COLORREF crColor);HBRUSH CreateSolidBrush(COLORREF crColor);HBRUSH CreatePatternBrush(HBITMAP hbmp);HBRUSH CreateHatchBrush(int fnStyle, COLORREF clrref);它可以指定画笔风格,宽度和颜⾊。
补充(5)图形设备接口(GDI)
SetViewportOrg和 SetViewportOrg和SetWindowOrg
(4) pDC->SetMapMode(MM_LOMETRIC); pDC->SetViewportOrg(100, 100); (4) pDC->Rectangle(0,0,200,200); (5) pDC->SetMapMode(MM_LOMETRIC); pDC->SetWindowOrg(100, 100); pDC->Rectangle(0,0,200,200); (5) 注意:MM_LOMETRIC模式下逻辑坐标系 与设备坐标系Y方向相反。 移动窗口原点或视口原点都能达到移动图形的目的,但移动的量是不 一样的。移动窗口原点,移动量以逻辑坐标为单位;移动视口原点, 移动量以像素为单位。
VC坐标系解析——逻辑坐标 VC坐标系解析——逻辑坐标 坐标系解析——
逻辑坐标除MM_TEXT模式外均指物理尺寸,如mm,inch等。 Windowsd GDI函数用逻辑坐标系。 逻辑坐标的坐标X,Y正方向随着映射模式的不同而不同。 当程序员在调用一个画线的GDI函数LineTo,画出25.4mm(1英寸) 长的线时,他并不需要考虑输出的是何种设备。若设备是VGA显示器, Windows自动将其转化为96个像素点;若设备是一个300dpi的激光打 印机,Windows自动将其转化为300个像素点。
映射模式
要指定绘图位置,需使用坐标系。Windows提供了若干种不同的坐标 系,它们分为两类:设备坐标系和逻辑坐标系。除以下三种设备坐标 系外,其余的均为逻辑坐标系: (1) 屏幕坐标系:使用整个屏幕作为坐标区域。 (2) 窗口坐标系:使用包括边界在内的整个应用程序窗口作为坐标区域。 (3) 用户区坐标系:只使用窗口中的用户区作为坐标区域,不包括边界 及菜Байду номын сангаас栏和滚动条等。
第5章GDI+图形设备接口加
第5章GDI+图形设备接⼝加第5章 GDI+GDI+(Graphics Device Interface Plus 图形设备接⼝加)是Windows XP 和Windows Server 2003操作系统的图形⼦系统,也是.NET 框架的重要组成部分和窗体绘图的主要⼯具,负责在屏幕和打印机上绘制图形图像和显⽰信息。
顾名思义,GDI+是Windows 早期版本所提供的图形设备接⼝GDI 的后续版本。
GDI+是⼀种应⽤程序编程接⼝(API),分别通过⼀套C++类和⼀套部署为托管代码的类来展现,这两套类分别被称为GDI+的“C++封装”和“托管类接⼝”。
GDI+不但在功能上⽐GDI 要强⼤很多,⽽且在代码编写⽅⾯也更简单,因此会很快成为Windows 图形图像程序开发的主要⼯具。
本章将介绍GDI+的特点和新增功能,以及GDI+ API 的具体使⽤⽅法,包括⼆维⽮量图形的绘制、图像处理的应⽤、以及⽂字的显⽰等。
由于本章内容较多,有些章节不作为基本要求,⽤*号表⽰的章节是可选的。
5.1 概述GDI+与GDI ⼀样,都具有设备⽆关性。
⽽且GDI+是建⽴在GDI 之上的⼀种⾼层接⼝,供Windows 应⽤程序和.NET 框架调⽤。
参见下图:GDI+的体系结构本节⾸先介绍GDI+的⼏个主要新增的特性及其功能,然后说明它给Windows 图形图像程序的开发模式带来的变化,最后给出⼀个代码实例,介绍如何在VC++中使⽤GDI+进⾏程序开发。
1.GDI+的功能GDI+主要提供了以下三种功能:1)⼆维⽮量图形与MFC中代表GDI的CDC和CGDIObject的诸派⽣类(CPen、CBrush、CFont等)类似,GDI+的Graphics等类也提供绘制各种⼆维⽮量图形(如直线、折线、矩形、椭圆、多边形等)的功能。
⽽且GDI+还增加了许多新的特性和功能,如⽆当前状态的绘图模式、含透明成分(α混⾊)的颜⾊类Color、图案笔、颜⾊可渐变的刷、贝塞尔和样条曲线、持久的路径、可伸缩的区域、功能强⼤的矩阵和变换等等。
图形设备接口GDI基本概念
• 所谓设备无关性,是指操作系统屏蔽了硬件设备的差异, 使用户编程时一般无需考虑(kǎolǜ)设备的类型,如不同种 类的显示器或打印机。
• CPaintDC类是OnPaint()函数使用的设备环境类,它代表一个 窗口的绘图画面。如果添加WM_PAINT消息处理函数OnPaint(), 就需要使用CPaintDC类来定义一个设备环境对象。
• CClientDC类代表了客户区设备环境。当在客户区实时绘图时, 需要利用(lìyòng)CClientDC类定义一个客户区设备环境。
Windows绘图过程和设备无关(wúguān)性的实现:
GDI处于设备驱动程序的上一层,当程序调用绘图函数时,GDI将绘图命令传送 给当前(dāngqián)设备的驱动程序,以调用驱动程序提供的接口函数。驱动程序的接 口函数将Windows绘图命令转化为设备能够执行的输出命令,实现图形的绘制。不同 设备具有不同的驱动程序,设备驱动程序是设备相关的。
第十页,共16页。
• 设备环境中的“设备”是指任何类型的显示器或打印机等输 出设备,绘图时用户不用关心所使用(shǐyòng)设备的编程 原理和方法。所有的绘制操作必须通过设备环境进行间接的 处理,Windows自动将设备环境所描述的结构映射到相应 的物理设备上。
• 从根本上来说,设备环境DC是一个Windows数据结构,该 结构存储着程序向设备输出时所需要的信息,应用程序利用 它定义图形对象及其属性,并实现应用程序、设备驱动程序 和输出设备之间绘图命令的转换。
• 设备环境也称设备描述表或设备上下文,它是由Windows管 理的一个数据结构,它保存了绘图操作中一些共同需要设置 的信息,如当前的画笔、画刷、字体和位图等图形对象及其 属性,以及(yǐjí)颜色和背景等影响图形输出的绘图模式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第5章 GDI+GDI+(Graphics Device Interface Plus 图形设备接口加)是Windows XP 和Windows Server 2003操作系统的图形子系统,也是.NET 框架的重要组成部分和窗体绘图的主要工具,负责在屏幕和打印机上绘制图形图像和显示信息。
顾名思义,GDI+是Windows 早期版本所提供的图形设备接口GDI 的后续版本。
GDI+是一种应用程序编程接口(API),分别通过一套C++类和一套部署为托管代码的类来展现,这两套类分别被称为GDI+的“C++封装”和“托管类接口”。
GDI+不但在功能上比GDI 要强大很多,而且在代码编写方面也更简单,因此会很快成为Windows 图形图像程序开发的主要工具。
本章将介绍GDI+的特点和新增功能,以及GDI+ API 的具体使用方法,包括二维矢量图形的绘制、图像处理的应用、以及文字的显示等。
由于本章内容较多,有些章节不作为基本要求,用*号表示的章节是可选的。
5.1 概述GDI+与GDI 一样,都具有设备无关性。
而且GDI+是建立在GDI 之上的一种高层接口,供Windows 应用程序和.NET 框架调用。
参见下图:GDI+的体系结构本节首先介绍GDI+的几个主要新增的特性及其功能,然后说明它给Windows 图形图像程序的开发模式带来的变化,最后给出一个代码实例,介绍如何在VC++中使用GDI+进行程序开发。
1.GDI+的功能GDI+主要提供了以下三种功能:1)二维矢量图形与MFC中代表GDI的CDC和CGDIObject的诸派生类(CPen、CBrush、CFont等)类似,GDI+的Graphics等类也提供绘制各种二维矢量图形(如直线、折线、矩形、椭圆、多边形等)的功能。
而且GDI+还增加了许多新的特性和功能,如无当前状态的绘图模式、含透明成分(α混色)的颜色类Color、图案笔、颜色可渐变的刷、贝塞尔和样条曲线、持久的路径、可伸缩的区域、功能强大的矩阵和变换等等。
与MFC类似,用户也可以使用GDI+提供的Metafile、MetafileHeader和MetaHeader类在图元文件中记录图形和图像的命令序列。
2)图像处理与MFC类似,GDI+提供了Image、Bitmap和Metafile类,可用于显示、操作和保存位图。
它们支持众多的图像文件格式,还可以进行多种图像处理操作。
3)文字显示版式与MFC类似,GDI+也是使用各种字体、字号和样式来显示文本。
GDI +为这种复杂任务提供了大量的支持,包括字体族类FontFamily、字体类Font和字体集类FontCollection及其两个派生类——InstalledFontCollection(已安装字体集)和PrivateFontCollection(专用字体集)等。
GDI+中的新功能之一是提供了可增强字体清晰度的ClearType(清晰活字)文字处理技术,利用子像素来消除锯齿,可使文本在LCD 屏幕上呈现时显得比较平滑。
4)功能汇总GDI+的C++封装包含54个类、12个函数、6类(226个)图像常量、55种枚举和19种结构。
GDI+的托管类接口则包含大约60个类、50个枚举和8个结构。
这两种封装中的Graphics类都是GDI+的核心功能,它是实际绘制直线、曲线、图形、图像和文本的类。
通过这些类和接口可以实现:●使用笔绘制线条和形状●使用刷填充形状●使用图像、位图和图元文件●α混合线条和填充●字体和文本●构造并绘制曲线●用颜色渐变的梯度刷填充形状●构造并绘制轨迹●变换●图形容器●区域●重新着色读取元数据等非常丰富强大的功能。
2.GDI+新增特性1)渐变画刷渐变画刷(gradient brush梯度刷)通过提供用于填充图形、路径和区域的线性渐变画笔和路径渐变画笔,GDI+扩展了GDI 的功能。
渐变画笔还可用于绘制直线、曲线和路径。
线性渐变画笔可用于使用颜色来填充图形,画笔在图形中移动时,颜色会逐渐改变。
例如,假定通过指定图形左边为蓝色、右边为绿色,创建了一个水平渐变画笔。
当用水平渐变画笔填充该图形时,随着画笔从图形的左边移至右边,颜色就会由蓝色逐渐变为绿色。
用类似方法定义的垂直渐变画笔填充的图形,颜色从上到下变化。
图6-1显示了用水平渐变画笔填充的椭圆和用斜式渐变画笔填充的区域。
图6-1 水平和斜式渐变画笔用路径渐变画笔填充图形时,可选择不同的方法来指定当从图形的一部分至另一部分移动画笔时颜色的变化方式。
一种选择是指定中心颜色和边缘颜色,在从图形中间向外边缘移动画笔时,像素逐渐从一种颜色变化到另一种颜色。
图6-2显示了用路径渐变画笔填充的路径(该路径是用一对贝塞尔样条创建的)。
图6-2 路径渐变画笔2)基数样条函数GDI+支持在GDI 中不支持的基数样条(cardinal spines)。
基数样条是一连串单独的曲线,这些曲线连接起来形成一条较长的光滑曲线。
样条由点的数组指定,并通过该数组中的每一个点。
基数样条平滑地(没有锐角)通过数组中的每一个点,因此,比通过连接直线创建的路径更光滑精准。
图6-3显示了两个路径:一个以基数样条的形式创建;另一个通过连接直线创建。
图6-3 基数样条路径和折线路径3)持久路径对象在GDI 中,路径属于设备上下文,并且会在绘制时被毁坏。
利用GDI +,绘图由Graphics 对象执行,可以创建并维护几个与Graphics对象分开的持久的路径对象(persistent path object)——GraphicsPath对象。
绘图操作不会破坏GraphicsPath 对象,因此可以多次使用同一个GraphicsPath 对象来绘制路径。
4)变换和矩阵对象GDI+提供了Matrix(矩阵)对象,它是一种可以使(缩放、旋转和平移等)变换(transformation)简易灵活的强大工具。
矩阵对象一般与变换对象联合使用。
例如,GraphicsPath 对象具有Transform 方法,此方法接收Matrix 对象作为参数。
单一的3×3矩阵可存储一种变换或一个变换序列。
图6-4显示了一个路径在执行两种变换前后的情况。
图6-4 路径的变换5)可伸缩区域GDI+ 通过对可伸缩区域(Scalable Regions)的支持极大地扩展了GDI。
在GDI 中,区域被存储在设备坐标中,而且,可应用于区域的惟一变换是平移。
而GDI+在全局坐标中存储区域,并且允许区域发生任何可存储在变换矩阵中的变换(如缩放和旋转)。
图6-5显示一个区域在执行三种变换(缩放、旋转和平移)前后的情况。
图6-5 区域的三种变换(缩放、旋转和平移)6)α混色在图6-5中,可以在变换区域(用蓝色阴影画笔填充)中看到未变换区域(用红色填充)。
这是由GDI+支持的α混色(Alpha Blending,透明混合)实现的。
使用α混色,可以指定填充颜色的透明度。
透明色与背景色相混合———填充色越透明,透出的背景色就越多。
图6-6显示四个用相同颜色(红色)填充、但透明层次不同的椭圆。
图6-6 不同透明度7)丰富的图像格式支持GDI+提供Image、Bitmap 和Metafile 类,可以用不同的格式加载、保存和操作图像。
GDI+支持BMP、GIF、JPEG、EXIF、PNG、TIFF、ICON、WMF、EMF共9种常见的图像格式。
这些已经被ATL/MFC中的基于GDI+的CImage类所体现。
8)GDI+的不足虽然,相对于GDI来说,GDI+ 确实增加了许多新特性,而且功能更强大,使用也更方便。
但是,这并不等于GDI+ 就能够完全代替GDI。
因为GDI+实际上是GDI的封装和扩展,GDI+的执行效率一般要低于GDI的。
另外,GDI+不支持图的位运算,那么就不能进行异或绘图等操作。
而且在Visual C++中,GDI+还不支持双缓存机制(如内存DC和显示DC),这将大大影响GDI+ 在高速图形、图像、动画和视频等方面的应用。
3.编程模式的改变GDI+的出现,也使基于GDI的编程模式产生了很大变化:GDI+用一个“无状态模式”,取代了GDI中(需要先将各种工具和项目选入DC对象后,才能进行绘图的)“状态模式”。
主要体现在以下几个方面:1)DC句柄和图形对象设备上下文(DC = Device Context)是GDI中使用的一种结构,用于存储与特定显示设备的功能、以及指定如何在该设备上绘制项目之属性相关的信息。
用于屏幕显示的DC还与特定窗口相关联。
为了使用GDI API进行绘图,必须首先获得一个DC的句柄(HDC = Handle to a DC),然后将该句柄作为参数,传递给实际进行绘图的GDI 函数。
还可以将此句柄作为参数,传递给获取和设置DC属性的GDI 函数。
使用GDI+,不需要再(直接)使用句柄或设备上下文,而是只需(通过HDC)创建一个Graphics对象,然后用熟悉的面向对象方式来调用其中的各种绘图方法,例如:myGraphicsObject.DrawLine(&pen, x1, y1, x2, y2);正如DC是GDI 的核心,Graphics对象也位于GDI+的核心。
DC和Graphics对象的作用相似,但在使用设备上下文(GDI)的基于句柄的编程模式和使用Graphics对象(GDI+)的面向对象的编程模型之间,存在一些基本的差异。
Graphics对象(像DC一样)与屏幕上的特定窗口关联,并具有指定如何绘制项目的属性(如SmoothingMode和TextRenderingHint)。
但是,Graphics对象不受笔、刷、路径、图像或字体的约束,这与设备上下文不同。
例如,使用设备上下文绘制线条之前,必须先调用SelectObject 以使笔对象和DC关联,即将笔选入DC中。
在设备上下文中绘制的所有线条均使用该笔,直到选择另一支不同的笔为止。
在GDI+中,将Pen 对象作为参数传递给Graphics类的DrawLine 方法。
可以在一系列的DrawLine调用的每个调用中,使用不同的Pen对象,而不必将给定的Pen对象与Graphics对象关联。
2)绘制线条的两种方法下面每个示例都从点(20, 10)到点(200, 100)绘制一条宽为3的红色线条。
第一个示例调用GDI,第二个示例则通过托管类接口调用GDI+,这里都使用MFC。
也可以不使用MFC,而直接用API来进行GDI+ 绘图(由于篇幅有限,这里就不介绍了)。
(1)用GDI 画线利用MFC进行GDI绘图,步骤与API的差不多,只是MFC将各种GDI功能封装到了不同的类中。
例如,笔的类为CPen、点的类为CPoint、设备上下文的类为CDC。