WindowsGDI_的研究与应用

合集下载

GDI编程小结

GDI编程小结
有了这个字段,GDI就会很容易地检查当前进程标识符是否和GDI对象的nProcess字段一致,目的是强制对象句柄不能在另一个进程中访问的规则。
根据微软的文档,进程终止时,由该进程创建的所有GDI对象会被释放。如果你想知道这是怎样实现的,我们现在有一点线索了。GDI只需搜索GDI对象表并删除有指定进程标识符的对象。
2、 GDI函数分类
GDI的功能太多了,所以我们需要一种办法对Win32 GDI API的函数分类,以便理解GDI的结构,MSDN库将GDI API分成17个领域,清楚地描述了GDI的功能。
(1)位图:处理创建、绘制设备相关位图(DDB)、设备无关位图(DIB)、DIB段、像素和区域填充的函数。
4、GDI对象类型
GDI对象表
typedef struct
{
void * pKernel;
unsigned short nProcess;
unsigned short nCount;
unsigned short nUpper;
unsigned short nType;
void * pUser;
}GdiTableCell;
(1) pKernel指向页面池:对每个有效GDI对象,pKernel从不为空,并且值总是唯一的。因此看起来对每个GDI对象有一个相应的数据结构,这个数据结构只能从内核模式代码存取,甚至不能从GDI32.DLL直接存取。对于不同进程的对象,从pKernel的值中看不出明显区分区域来。pKernel指向的对象起始地址是0xE1000000,根据《Inside Windows NT》,起始地址是0xE1000000的区域一般是被称为“页面池”的可分页系统的内存堆。

GDI

GDI

一、GDIGDI是位于应用程序与不同硬件之间的中间层,这种结构让程序员从直接处理不同硬件的工作中解放出来,把硬件间的差异交给了GDI处理。

GDI通过将应用程序与不同输出设备特性相隔离,使Windows 应用程序能够毫无障碍地在Windows支持的任何图形输出设备上运行。

例如,我们可以在不改变程序的前提下,让能在Epson点式打印机上工作的程序也能在激光打印机上工作。

它把windows系统中的图形输出转换成硬件命令然后发送给硬件设备。

GDI是以文件的形式存储在系统中,系统需要输出图形时把它载入内存,如果转换成硬件命令时遇到非GDI命令,系统还可能载入硬件驱动程序,驱动程序辅助GDI把图形命令转换成硬件命令。

二、设备环境Windows系统是用来给应用程序提供设备独立性的工具,它是windows系统为了处理输出设备而使用的一种内部数据结构,设备环境是windos程序,驱动程序,和输出设备(如打印机,绘图仪)之间的纽带,GDI是一组C++类,它在驱动程序的协助下把数据描绘在硬件上,它位于应用程序与硬件之间,把数据从一方传到另一方。

在Visual Studio .NET中Micro$oft解决了GDI中的许多问题,并让它变得易用,GDI的.net版本叫做GDI+。

三、GDI+GDI+是GDI的下一个版本,它进行了很好的改进,并且易用性更好。

GDI的一个好处就是你不必知道任何关于数据怎样在设备上渲染的细节,GDI+更好的实现了这个优点,也就是说,GDI是一个中低层API,你还可能要知道设备,而GDI+是一个高层的API,你不必知道设备。

例如你如果要设置某个控件的前景和背景色,只需设置BackColor和ForeColor属性。

四、编程模式的变化“GDI uses a stateful model, whereas GDI+ uses a stateless”——GDI是有状态的,GDI+是无无状态的。

1、不再使用设备环境或句柄在使用GDI绘图时,必须要指定一个设备环境(DC),用来将某个窗口或设备与设备环境类的句柄指针关联起来,所有的绘图操作都与该句柄有关。

DDB与DIB的区别及GDI的作用

DDB与DIB的区别及GDI的作用

DDB与DIB的区别及GDI的作⽤DDB(设备相关位图)DIB(设备⽆关位图)DDB依赖于具体设备:DDB的颜⾊模式必需与输出设备相⼀致。

例如,如果当前的显⽰设备是256⾊模式,那么DDB必然也是256⾊的。

在256⾊以下的位图中存储的像素值是系统调⾊板的索引,其颜⾊依赖于系统调⾊板。

由于DDB⾼度依赖输出设备,所以DDB只能存在于内存中,它要么在视频内存中,要么在系统内存中DIB的与设备⽆关性主要体现在以下两个⽅⾯:DIB的颜⾊模式与设备⽆关。

例如,⼀个256⾊的DIB即可以在真彩⾊显⽰模式下使⽤,也可以在16⾊模式下使⽤。

256⾊以下(包括256⾊)的DIB拥有⾃⼰的颜⾊表,像素的颜⾊独⽴于系统调⾊板。

由于DIB不依赖于具体设备,因此可以⽤来永久性地保存图象。

DIB⼀般是以*.BMP⽂件的形式保存在磁盘中的,有时也会保存在*.DIB⽂件中。

运⾏在不同输出设备下的应⽤程序可以通过DIB来交换图象DDB的创建MFC的CBitmap类封装了DDB。

该类提供了⼏个函数⽤来创建DDB:BOOL LoadBitmap( LPCTSTR lpszResourceName );BOOL LoadBitmap( UINT nIDResource );该函数从资源中载⼊⼀幅位图,若载⼊成功则返回TRUE。

资源位图实际上是⼀个DIB,该函数在载⼊时把它转换成了DDB。

BOOL CreateBitmap( int nWidth, int nHeight, UINT nPlanes, UINT nBitcount, const void* lpBits );该函数⽤来创建⼀幅空⽩的DDB。

参数nWidth和nHeight以像素为单位说明了位图的宽度和⾼度。

nPlanes是DDB的⾊平⾯数,nBitcount是每个⾊平⾯的颜⾊位数。

⼀般来说,nPlanes为1,⽽nBitcount代表DDB中每个像素值所占的位数,但在创建16⾊DDB时,nPlanes为4,⽽nBitcount为1。

GDI+和GDI绘图性能对比实验

GDI+和GDI绘图性能对比实验

GDI+和GDI绘图性能对比实验本文通过完全相同的算法分别使用GDI和GDI+技术进行图像显示,对两种不同的技术进行对比试验来证明GDI+是否适用于图像实时显示。

标签:GDI;GDI+;性能GDI+是在GDI的基础上做了封装、优化和功能扩展,支持包括JPG、PNG、GIF、TIF等压缩格式的图像显示,绘图函数也加入了抗锯齿技术,显示效果更加细腻。

GDI+技术出现的初期功能方面的优势受到了热捧。

但其缺点是图像显示性能差。

众所周知,Windows GDI的图像显示性能并不高,而GDI+技术的性能较GDI还要低,究竟低多少,作者查阅了大量的文章,没有找到相应的实验数据。

于是做了一项实验来量化GDI和GDI+之间的性能差异。

下面这段是GDI实现图形显示的代码:经过实验,使用GDI技术在657*657的分辨率下,每次繪制711条线,每秒可以绘制180-260帧画面。

使用GDI+的方式采用了完全相同的算法和线的数量,代码如下所示:经过实验,同样在657*657的分辨率下,使用GDI+技术没帧绘制711条线,每秒只能绘制5-11帧画面,性能只有GDI的1/44,性能差距之巨大是实验前作者没有想到的。

做上述实验使用的计算机配置如下:2D技术在DirectX 7.0之后就不再继续发展了,后续之所以还有小幅性能提升是因为硬件频率的提升,包括CPU,内存和显卡。

GDI+技术根据实验来看已经完全无法承受动态图像显示的性能要求,即使对实时性没有要求的情况下,显示的流畅性也很差,只能显示静态画面。

当今计算机的显示器尺寸越来越大,分辨率也越做越高,即使是GDI在低分辨率下具有一定性能,高分辨率下的性能也很差。

而图形技术的发展近几年重点一直在3D技术上,所以如果需要实时显示动态画面最好还是使用3D技术。

但3D技术的另外一个弊端是程序设计的难度较大,依赖硬件加速。

所以,如果想要低成本,在性能和开发难度取折衷的选择应该是GDI技术,想要性能最优,建议使用3D技术实现。

windows gdi指标

windows gdi指标

GDI(图形设备接口)是Windows操作系统中的一个重要组件,用于在屏幕上绘制文本和图形。

以下是GDI的一些重要指标:
1. 颜色深度:表示图形中可以显示的颜色数量。

例如,24位颜色深度可以显示1600万种颜色。

2. 分辨率:表示屏幕上的像素密度,通常以每英寸点数(DPI)表示。

高分辨率可以提供更清晰的图像和文本。

3. 字体支持:GDI支持多种字体,包括TrueType和PostScript字体。

字体的大小和样式决定了文本的外观和可读性。

4. 图形绘制:GDI提供了多种绘制图形的函数,如线条、圆、多边形、曲线等。

这些函数可以用于创建各种形状和效果。

5. 图像处理:GDI支持对图像进行各种处理,如缩放、旋转、裁剪、颜色转换等。

这些功能可以帮助用户对图像进行编辑和美化。

6. 性能:GDI的性能取决于多个因素,如硬件性能、系统资源占用等。

在某些情况下,使用GDI可能会影响应用程序的运行速度和响应时间。

7. 兼容性:由于GDI是Windows操作系统的一部分,因此它与Windows操作系统和其他应用程序的兼容性较好。

总之,GDI是Windows操作系统中非常重要的组件之一,它提供了多种功能和指标,可以帮助用户创建高质量的图形和文本。

关于windows编程技术14GDI+编程基础

关于windows编程技术14GDI+编程基础

第14章 GDI+编程基础GDI+(Graphics Device Interface Plus,图形设备接口加)是Windows XP及以上版本操作系统的图形子系统,也是传统.NET框架的重要组成部分和窗体绘图的主要工具,负责在屏幕和打印机上绘制图形图像和显示信息。

顾名思义,GDI+是Windows早期版本所提供的图形设备接口GDI的后续版本,是建立在GDI之上的一个高层图形子系统。

GDI+是一种API,分别通过一套C++类和一套部署为托管代码的类来展现,这两套类分别被称为GDI+的“C++封装”和“托管类接口”。

GDI+不但在功能上比GDI要强大很多,而且在代码编写方面也更简单,因此会成为Windows图形图像程序开发的主要工具之一。

由于篇幅所限,本书只简单介绍利用MFC进行GDI+编程的一些基本内容,也不讲GDI+的API 编程。

基于GDI+托管封装的.NET窗体绘图,将在第18章中再介绍。

对GDI+编程有兴趣的读者,可以参考如下图书:●周鸣杨、赵景亮. 精通GDI+编程. 清华大学出版社,2004年2月(C++ / MFC)。

●Mahesh Chand(韩江等译). GDI+图形程序设计. 电子工业出版社,2005年3月(C# / .NET)。

本章将介绍GDI+的结构和组成,讨论GDI+的几个主要新增特性与功能,说明GDI+给Windows图形图像程序的开发模式带来的变化。

介绍C++封装的GDI+ API的具体使用方法,主要讲解二维矢量图形绘制和文字显示等基本内容。

GDI+的路径、区域、变换、图像处理和图元文件等高级编程内容,安排在下一章介绍。

14.1 GDI+的结构与组成本节先介绍GDI+的体系结构,再列出C++封装的GDI+ API的具体组成。

14.1.1 GDI+的结构GDI+是建立在GDI之上的一种高层图形子系统,基础是GDI+平面API,有C++和托管两种封装。

注意,虽然GDI+是GDI的发展,但是GDI+并非设计来替代GDI的,它不能独立工作,底层还得靠GDI实现。

GDI绘图函数机制对应用程序的影响和 解决方法

GDI绘图函数机制对应用程序的影响和 解决方法

Geomatics Science and Technology 测绘科学技术, 2015, 3(4), 67-85Published Online October 2015 in Hans. /journal/gst/10.12677/gst.2015.34010Effect on Application by Mechanism of GDIRendering Functions and SolutionsChunmei Chen1, Qingyuan Li21China University of Mining & Technology, Beijing2Chinese Academy of Surveying and Mapping, BeijingEmail: 815310703@, liqy@Received: Oct. 2nd, 2015; accepted: Oct. 18th, 2015; published: Oct. 22nd, 2015Copyright © 2015 by authors and Hans Publishers Inc.This work is licensed under the Creative Commons Attribution International License (CC BY)./licenses/by/4.0/AbstractGDI drawing-functions in Windows API were analyzed and we found that GDI drawing-function mapped the world coordinate system (Cartesian coordinate system) origin (0,0) to the pixel cen-ter between (0,0) and (1,1) of the device coordinate system (screen coordinates). It pointed out that in order to maintain the same graphic geometric features and avoiding overprinting, GDI drawing functions compromised with the endpoints and the boundary pixels, which caused some strange phenomenon many programmers have not found and it was difficult to understand. In re-sponse to these phenomena, explanations are given. In addition, the effect on some applications is pointed out and solutions are proposed.KeywordsGraphics Device Interface, Drawing-Function, Primitive Output, Geometric FeaturesGDI绘图函数机制对应用程序的影响和解决方法陈春梅1,李青元21中国矿业大学(北京),北京2中国测绘科学研究院,北京Email: 815310703@, liqy@陈春梅,李青元收稿日期:2015年10月2日;录用日期:2015年10月18日;发布日期:2015年10月22日摘要对Windows API中的GDI绘图函数进行分析研究,发现了GDI绘图函数将世界坐标系(笛卡尔坐标系)原点(0,0)映射到设备坐标系(屏幕坐标系)的原点(0,0)到(1,1)之间的像素中心处。

Windows的GDI相关函数的说明

Windows的GDI相关函数的说明

Windows的GDI相关函数的说明字体相关的函数AddFontResource 在Windows系统中添加一种字体资源CreateFont 用指定的属性创建一种逻辑字体CreateFontIndirect 用指定的属性创建一种逻辑字体CreateScalableFontResource 为TureType字体创建资源文件,以便加入系统DrawText 将文本描绘到指定的矩形中DrawTextEx 与DrawText相似,只是加入了更多的功能EnumFontFamilies 列举指定设备可用的字体EnumFontFamiliesEx 列举指定设备可用的字体EnumFonts 列举指定设备可用的字体ExtTextOut 经过扩展的文本描绘函数。

也请参考SetTextAlign函数GetAspectRatioFilterEx 用SetMapperFlags选择字体时,用以判断纵横比大小GetCharABCWidths 判断TureType字体中一个或多个字符的A-B-C大小GetCharABCWidthsFloat 查询一种字体中一个或多个字符的A-B-C尺寸GetCharacterPlacement 该函数用于了解如何用一个给定的字符显示一个字串GetCharWidth 调查字体中一个或多个字符的宽度GetFontData 接收一种可缩放字体文件的数据GetFontLanguageInfo 返回目前选入指定设备场景中的字体的信息GetGlyphOutline 取得TureType字体中构成一个字符的曲线信息GetKerningPairs 取得指定字体的字距信息GetOutlineTextMetrics 接收与TureType字体内部特征有关的详细信息GetRasterizerCaps 了解系统是否有能力支持可缩放的字体GetTabbedTextExtent 判断一个字串占据的范围,同时考虑制表站扩充的因素GetTextAlign 接收一个设备场景当前的文本对齐标志GetTextCharacterExtra 判断额外字符间距的当前值GetTextCharset 接收当前选入指定设备场景的字体的字符集标识符GetTextCharsetInfo 获取与当前选定字体的字符集有关的详细信息GetTextColor 判断当前字体颜色。

GDI原理

GDI原理

GDI原理GDI,全称为图形设备接口(Graphics Device Interface),是一种用于在Windows操作系统中绘制图形的技术。

它提供了一种将图形显示在屏幕上的标准方法,同时也是Windows应用程序与显示设备之间通信的桥梁。

在本文中,我们将深入探讨GDI的原理及其工作方式。

首先,GDI通过使用设备无关的图形对象(如画笔、画刷、字体等)来描述图形。

这些图形对象可以在不同的输出设备上进行绘制,而无需对应用程序进行修改。

这种设备无关性使得GDI成为了一种非常灵活的图形绘制技术。

其次,GDI通过使用设备上下文(Device Context,简称DC)来实现图形的绘制。

设备上下文是一个与设备相关的数据结构,它包含了绘制图形所需的各种参数和信息。

应用程序可以通过GDI函数来获取设备上下文,并在其上进行图形的绘制操作。

另外,GDI还提供了一系列的绘图函数,用于在设备上下文中进行各种图形的绘制操作。

这些函数包括了直线绘制、矩形绘制、圆形绘制、文本输出等功能。

通过调用这些函数,应用程序可以实现各种复杂的图形绘制效果。

除此之外,GDI还支持图形的变换和组合操作。

应用程序可以通过GDI函数来对图形进行平移、旋转、缩放等变换操作,也可以将多个图形进行组合,实现复杂的图形效果。

最后,GDI通过使用裁剪区域来限制图形的绘制范围。

裁剪区域是一个与设备相关的区域,它可以用来限制图形的绘制范围,从而实现局部图形的显示和隐藏。

总的来说,GDI是一种强大而灵活的图形绘制技术,它为应用程序提供了丰富的图形绘制功能,并且具有良好的设备无关性。

通过使用GDI,应用程序可以实现各种复杂的图形效果,从而提升用户界面的质量和用户体验。

在本文中,我们对GDI的原理及其工作方式进行了深入的探讨,希望能够帮助读者更好地理解和应用GDI技术。

通过对GDI的学习和掌握,我们可以更加轻松地实现各种复杂的图形效果,从而为用户提供更加丰富和优秀的应用程序。

gdi坐标系

gdi坐标系

gdi坐标系GDI(Graphics Device Interface)是Windows操作系统中的一个图形设备接口,它提供了一组函数和数据结构,用于在屏幕上绘制图形和文本。

GDI坐标系是GDI中用于描述图形和文本位置的坐标系,它与屏幕坐标系有所不同。

在GDI坐标系中,原点位于左上角,x轴向右延伸,y轴向下延伸。

这与屏幕坐标系相反,屏幕坐标系的原点位于左上角,x轴向右延伸,y轴向下延伸。

因此,在使用GDI绘制图形和文本时,需要将屏幕坐标系中的位置转换为GDI坐标系中的位置。

GDI坐标系的单位是逻辑单位(logical unit),它是一个抽象的单位,与屏幕分辨率无关。

在GDI中,逻辑单位的大小由设备环境(device context)决定,设备环境是一个与设备相关的数据结构,用于描述绘图设备的属性和状态。

在创建设备环境时,可以指定逻辑单位的大小,通常使用像素作为逻辑单位。

在GDI中,可以使用以下函数将屏幕坐标系中的位置转换为GDI坐标系中的位置:1. SetMapMode:设置设备环境的映射模式,映射模式决定了逻辑单位和物理单位之间的转换方式。

2. SetViewportOrgEx:设置视口原点,视口是设备环境中用于显示图形和文本的区域,视口原点是视口左上角的坐标。

3. SetWindowOrgEx:设置窗口原点,窗口是设备环境中用于绘制图形和文本的区域,窗口原点是窗口左上角的坐标。

4. DPtoLP:将设备坐标(即屏幕坐标系中的坐标)转换为逻辑坐标(即GDI坐标系中的坐标)。

5. LPtoDP:将逻辑坐标转换为设备坐标。

使用这些函数可以方便地在GDI坐标系中绘制图形和文本,同时也可以实现屏幕坐标系和GDI坐标系之间的转换。

总之,GDI坐标系是GDI中用于描述图形和文本位置的坐标系,它与屏幕坐标系有所不同。

在使用GDI绘制图形和文本时,需要将屏幕坐标系中的位置转换为GDI坐标系中的位置。

可以使用一些函数来实现这种转换,方便地在GDI坐标系中绘制图形和文本。

GDI

GDI
设备描述表句柄一旦获得,那么系统将使用默认的属性值填充设备描述表结构。
如果有必要,我们可以使用一些GDI函数获取和改变设备描述表中的属性值。
感谢观看
GDI+在区域(regions)方面对GDI进行了改进,在GDI中,Regions存储在设备坐标中,对Regions唯一可进 行图形变换的操作就是对区域进行平移。而GDI+用世界坐标存储区域(Regions),允许对区域进行任何图形变换 (譬如如图所示的缩放),图形变换以变换矩阵存储,下面例子是一个区域变换前后的例子(缩放、旋转、平移)
在Windows操作系统下,绝大多数具备图形界面的应用程序都离不开GDI,我们利用GDI所提供的众多函数就 可以方便的在屏幕、打印机及其它输出设备上输出图形,文本等操作。GDI的出现使程序员无需要关心硬件设备 及设备驱动,就可以将应用程序的输出转化为硬件设备上的输出,实现了程序开发者与硬件设备的隔离,大大方 便了开发工作。
你可能会注意到上面显示的图形,红色未平移区域与变换后区域有一部分交叉区域,这一部分形成的梦幻效 果就是由GDI+支持的Alpha Blending(混合)实现的,利用alpha融合,你可以指定填充颜色的透明度,透明颜 色与背景色相互融合,填充色越透明,背景色显示越清晰,四个椭圆被填充了同样的颜色,但由于拥有不同的透 明度而呈现不同的显示效果。
GDI+提供了矩阵对象,一个非常强大的工具,使得编写图形的旋转、平移、缩放代码变得非常容易。一个矩 阵对象总是和一个图形变换对相起来,比方说,路径对象(PATH)有一个Transform方法,它的一个参数能够接 受矩阵对象的,每次路径绘制时,它能够根据变换矩阵绘制。下面的图形是一个图形变换前后的例子,变换按照 先缩放后旋转完成。

打印语言

打印语言

PS、PCL、GDI三种打印语言的比较目前在激光打印机产品主要有2种控制方式:采用Postscript、PCL标准页面描述语言的打印机和Windows GDI(Graphical Device Interface,图形设备接口)位图打印机。

一、Postscript和PCL是两种标准化的页面描述语言,其工作流程都是首先在计算机端将打印内容解释成标准的页面描述文件然后传送到打印机控制器中,在打印控制器中再将页面描述文件解释成可以打印的光栅图像,从其工作流程看,此两种方式中都对打印机中的打印控制器有很高的要求,同时要求打印机内部有足够的内存。

但它们的共同优势是标准化和与设备无关性,对计算机系统资源占用少,而其最新版本中都提高了对字库、图形和图像的解释能力,因此对于打印质量要求较高的产品,大都采用了此两类语言。

但相对来说,由于对打印控制器性能的高要求,一定程度上会增加机器成本,尤其是Postscript对打印控制器的性能要求更高。

PS和PCL的主要区别是:1、Postscript是Adobe公司的注册产品,打印机厂商在其产品中使用Postscript 语言要付费,因此使用Postscript的打印机的成本要比使用其他语言和控制方式的打印机要高。

因此目前也出现了一些Postscript仿真,可以和Adobe公司Postscript兼容,也无需付费。

而PCL是开放的,其他厂商可以在他们的打印机产品中自由模仿或使用PCL语言,所以PCL的普及程度远远高于Postscript语言。

2、从性能上看,PCL语言比较适合一些普通的商务办公应用,而Postscript语言更加适合对图形和色彩准确度要求比较高的专业应用。

这也是目前许多打印机产品同时提供PCL和Postscript两个版本的驱动的一个重要原因。

另外Postscript 语言也可以在苹果机平台下使用。

GDI目前主要的是应用在一些较低端的产品中。

GDI充分利用计算机的计算能力和资源,分担大部分本来需要打印机控制器完成的工作。

06图形设备接口GDI基本概念

06图形设备接口GDI基本概念

设备坐标系分为屏幕坐标系、窗口坐标系和客户区坐标系三种相互独立的坐标系。屏幕坐标系以屏幕左上角为原点,一些与整个屏幕有关的函数均采用屏幕坐标,如GetCursorPos()、SetCursorPos()、CreateWindow()、MoveWindow()。弹出式菜单使用的也是屏幕坐标。窗口坐标系以窗口左上角为坐标原点,它包括窗口标题栏、菜单栏和工具栏等范围。客户区坐标系以窗口客户区左上角为原点,主要用于客户区的绘图输出和窗口消息的处理。鼠标消息的坐标参数使用客户区坐标,CDC类绘图成员函数使用与客户区坐标对应的逻辑坐标。
1. GDI的一些基本概念
Windows绘图过程和设备无关性的实现:
GDI处于设备驱动程序的上一层,当程序调用绘图函数时,GDI将绘图命令传送给当前设备的驱动程序,以调用驱动程序提供的接口函数。驱动程序的接口函数将Windows绘图命令转化为设备能够执行的输出命令,实现图形的绘制。不同设备具有不同的驱动程序,设备驱动程序是设备相关的。
如果采用MFC方法编程,MFC提供了不同类型的DC类,每一个类都封装了DC句柄,并且它们的构造函数自动调用获取DC的API函数,析构函数自动调用释放DC的API函数。因此,在程序中通过声明一个MFC设备环境类的对象就自动获取了一个DC,而当该对象被销毁时就自动释放了获取的DC。MFC AppWizard应用程序向导创建的OnDraw()函数自动支持所获取的DC。MFC的DC类包括CDC、CPaintDC、CClientDC、CWindowDC和CMetaFileDC等,其中CDC类是MFC设备环境类的基类,其它的MFC设备环境类都是CDC的派生类。
获取设备环境DC的方法:
在程序中不能直接存取DC数据结构,只能通过系统提供的一系列函数或使用设备环境的句柄HDC来间接地获取或设置设备环境结构中的各项属性,如显示器高度和宽度、支持的颜色数及分辨率等。如果采用SDK方法编程,获取DC的方法有两种:在WM_PAINT消息处理函数中通过调用API函数BeginPaint()获取设备环境,在消息处理函数返回前调用API函数EndPaint()释放设备环境。在其他函数中通过调用API函数GetDC()获取设备环境,调用API函数ReleaseDC()释放设备环境。

GDI+中常见的几个问题

GDI+中常见的几个问题

GDI+中常见的几个问题1.GDI+的前世今生GDI+全称图形设备接口,Graphics Device Interface (GDI) ,他的爸爸叫做GDI, 用C写的。

Windows XP出来以后用C++重新写了一下,变成了GDI+。

从.NET Framework 1.0开始,GDI+就被正式封装在了.NET Framework里面,并被广泛地应用到了所有和图形图像相关的程序中。

不幸的是,这个GDI+引入了微软有史以来最大的2个patch,造成了Microsoft IT, Support, Developer, Tester的无数麻烦。

[1][2]GDI+没有用显卡加速,所以Windows Vista推荐用Windows Display Driver Model (WDDM)了,支持渲染,3D加速。

不过普通的应用程序,用GDI/GDI+其实是完全足够了,所以GDI+是在微软平台上开发图形图像程序的最好选择了。

至少现在没有听说微软准备重新写GDI。

GDI+ 可以用来做图形处理,也可以做图像处理。

这里只分析几个使用.NET Framework 容易出错的地方。

2.GDI+一般性错误(A generic error occurred in GDI+)这是使用GDI+的时候最滑稽的一个Exception,里面啥信息都没有。

对于刚刚开始使用.NET Framework开发者来说,很难发现这个问题到底是为什么。

我们先来看看下面一段代码string fileName = "sample.jpg";Bitmap bmp = new Bitmap(fileName);bmp.Save(fileName, ImageFormat.Jpeg);这段代码的目的是要打开一个Bitmap,然后保存。

可惜这段代码一定会给你一个GDI+一般性错误:System.Runtime.InteropServices.ExternalException其中的Error Code是0x80004005, innerException是空。

王艳平的《windows程序设计》

王艳平的《windows程序设计》

王艳平的《windows程序设计》《Windows程序设计》是王艳平所著的一本专业书籍,它为读者提供了深入了解Windows操作系统编程的基础知识和高级技术。

这本书不仅适合初学者学习,也适合有一定基础的开发者进行深入研究。

全书内容丰富,覆盖了从Windows编程的基本概念到复杂的系统级编程技巧。

第一章:Windows编程基础本章介绍了Windows操作系统的基本概念,包括操作系统的发展历程、Windows的架构以及Windows编程的特点。

此外,还详细讲解了Windows编程环境的搭建,包括开发工具的选择、SDK的安装和配置等。

第二章:Windows API概述Windows API是Windows编程的核心,本章对Windows API进行了全面的介绍。

包括API的分类、调用方式、参数传递机制等。

同时,还介绍了如何使用API来实现窗口的创建、消息的发送和接收等基本操作。

第三章:窗口与消息处理窗口是Windows应用程序的基本组成元素。

本章详细讲解了窗口的创建过程、窗口的属性设置、窗口的显示与隐藏等。

同时,还深入探讨了消息循环的概念,以及如何通过消息循环来处理用户输入和系统事件。

第四章:图形与文本绘制图形和文本是用户界面的重要组成部分。

本章介绍了Windows GDI(图形设备接口)的基本概念和使用方法,包括如何使用GDI进行图形绘制、文本输出以及字体和颜色的设置等。

第五章:动态链接库与资源动态链接库(DLL)和资源是Windows编程中常用的技术。

本章讲解了DLL的基本概念、创建和使用,以及资源文件的创建和管理。

通过本章的学习,读者可以掌握如何在应用程序中使用DLL和资源来增强程序的功能和可扩展性。

第六章:多线程编程多线程是提高程序性能的重要手段。

本章详细介绍了Windows多线程编程的基本概念和实现方法,包括线程的创建、同步、通信以及线程池的使用等。

通过本章的学习,读者可以掌握如何编写高效的多线程应用程序。

【Windows编程】系列第五篇: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);它可以指定画笔风格,宽度和颜⾊。

GDI+在图形学教学中的研究与应用

GDI+在图形学教学中的研究与应用

GDI+在图形学教学中的研究与应用摘要:GDI+是一种优秀的图形编程技术,相比GDI,让程序员在实现图形算法时更直观,更方便。

为方便学生理解教学内容以及提高应用接口编程能力,主要叙述了基于GDI+技术的图形生成,填充,变换实现过程。

关键词:GDI+;图形学;应用接口;图元生成;图形变换0 引言Visual C ++.NET是微软公司可视化开发工具系列Visual 中的产品,是Windows应用程序最简便,最快捷的开发工具之一。

其包含了新型的图形设备接口GDI+,相比前期的图形设备接口GDI+,它能更容易完成二维或三维的图形处理,通过硬件加速来达到良好的视觉感受。

目前,国内已有不少程序开发人员在程序设计中使用GDI+技术来取代传统的GDI编程。

在计算机图形学教学和实践环节,通过GDI+技术的演示和实施,可以有效地帮助学生对二维、三维图形绘制以及图形变换的理解,而且让刚接触图形学的学生对应用接口的编程不再有畏惧心理,更容易进行课后的实践工作。

1 GDI+技术的新特点GDI+是负责在屏幕和打印机上显示和打印信息的应用编程接口,它让程序员在设计程序时不必考虑具体的硬件设备,直接使用由GDI+提供的类的方法就可以在显示器或打印机等输出设备上进行图形和文本的输出。

1.1 GDI+提供的主要功能(1)二维几何图形的处理:在受控GDI+中,一个类对象或结构体表示一个图元。

在.NET Framework中,二维矢量常规设计功能是在System.Drawing名称空间中定义的,而高级设计功能则是在System.Drawing.Drawing2D名称空间中定义的。

(2)显示图像:图像一般都存储为位图,用于存储位图信息的数据结构比用于存储矢量图形的数据结构更加复杂。

所以在GDI+中提供了处理这些复杂位图信息的类,Cached Bitmap就是一个可以在内存中快速访问和显示的位图类。

(3)排版:排版与使用各种各样的字体,尺寸和风格显示的文本有关。

坐标变换技术在Windows GDI设计中的应用

坐标变换技术在Windows GDI设计中的应用

个 属性 。对 于所有 的 映射模 式 , 以用如 下公 式 窗 口( 可 逻辑 ) 坐
标 转化 为视 口( 设备 ) 坐标 :
所 有的设备坐 标系都 以具体设 备 的像 素 为单位 , 水平轴 ( 轴 ) 即x
V w 。 = no - W n r) i p (Wi w x iOg e d
把 窗 口中 的坐 标 ( 逻辑 坐标 ) 化为视 口中的坐标 ( 转 设备坐 标 ) 。 视为 窗 口的客户 区域 , 但
是 。如 果 已经 用 G t no D 或 Cet C 得 了 一个 设 备 内 e Widw C r e 取 aD
容, 则视 口也可 以是 指整 窗 1坐 标或 者屏幕 坐标 。 ( O 是 客 3 点 0,)
12 设 备 坐 标 ( vc o r iae ) . DeieCo dn ts
标 映射 ” 。根据 转 换方 式 的不 同 , n o s Wid w 规定 了8 映 射模 式 种 ( p igMo e 。除了映射模式 外 , Ma pn d ) 与绘 制图形相 关的设备上下 文属性 还包括 窗 1原点 ( n o r i )视 口原点 ( e pr 0 3 Wid w O i n 、 g Vi ot - w
户 区域 ( 者整 个 窗 1 或 3或屏 幕 ) 的左 上 角 ,的值 向右 增 加 ,的 x y
值 向下 增加 。窗 口是基 于逻辑 坐标 的 ,其 单位 可 以是像素 、 毫
米 、 寸或 者任何 其 它单 位 。在G 绘 图 函数 中指定 的坐标 或 英 DI 参数 全部 为窗 口坐标 下的 值 。
r i) 窗 口范 围 ( n o xe t)视 1范 围 ( iw ot xe t) in、 g Wid wE tns 、 3 V e p r E tns4

windows编程技术10GDI编程3—动画

windows编程技术10GDI编程3—动画

第10章 GDI编程3-动画动画是利用人的视觉滞留缺陷(25ms~400ms)和心理认可来动态生成系列相关画面以产生运动视觉的技术。

位图动画是将预先制作好的一系列表示连续画面的位图,按一定的时间间隔一幅接一幅地连续显示,从而产生动画效果。

因为绘制动画所需的图形,以及拍摄和处理图片,需要美术、摄影、数字图像处理、动画设计等知识,我们这里不讲。

本书只介绍如何显示已有的位图(序列)以产生动画效果,以及如何动态绘制不同的简单图形以产生二维图形动画等。

用GDI编程实现动画,一般需要用到计时器(Timer)操作,通常在计时器响应函数OnTimer中(而不要使用OnDraw)绘图来实现动画。

10.1 固定位图动画本节介绍利用一系列的位图资源,在同一个屏幕位置,接连显示位图序列,以达到动画的效果的具体方法。

为此,可在交互绘图程序中添加一个如图10-1所示的位图动画对话框,并添加对应的对话框类CDukeDlg。

也可以创建一个基于对话框的独立的MFC应用程序。

图10-1 位图动画对话框资源当然还需添加相应的“位图动画”菜单项(ID_DUKE)和(为视图类添加)对应的菜单响应函数,并在该函数中创建对话框类的对象,打开对话框来运行动画:#include "DukeDlg.h"void CDrawView::OnDuke() {CDukeDlg dlg;dlg.DoModal();}10.1.1 准备位图、加入位图资源系列公爵(Duke)BMP文件T1.BMP ~ T10.BMP(见图10-2),来自Java吉祥物的GIF 动画文件,可存放在项目的res子目录的Duke子目录中(该位图资源已经打包成Duke.rar 文件后,放到了系里的网站和我的个人网页上)。

T1.BMP T2.BMP T3.BMP T4.BMP T5.BMPT6.BMP T7.BMP T8.BMP T9.BMP T10.BMP图10-2 Duke位图文件用VC的资源编辑器依次加入位图文件:在左边的项目工作区中选“资源视图”页,展开项目的资源列表,在“Bitmap”表项(若无此项,则可直接在项目资源项)上单击鼠标右键,在弹出的浮动菜单中选“添加资源”菜单项,在打开的“添加资源”对话框中,选中左边“资源类型”栏中的“Bitmap”表项,单击右边的“导入”按钮,在弹出的“导入”文件对话框中,定位Duke目录,选中所有Ti.BMP后按“打开”钮,则会自动加入ID为IDB_BITMAPi的位图资源。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Windows G DI+的研究与应用陈本峰,苏 琦(中国科学技术大学电子工程与信息科学系,安徽合肥230027)摘 要:G DI是W indows图形图像编程的主要接口,但是其功能贫乏,使用复杂给程序员带来很多的不便。

G DI+的出现使这一现象大为改观,它是微软的.Net Framew ork的一个重要组成部分,大大增强了W indows的图形图像开发接口,同时它也改变了传统的G DI编程模式,使开发工作大幅度简化。

首先从理论角度介绍G DI+的种种优越特性,再从代码开发的角度说明如何来使用G DI+。

关键词:G DI;G DI+;图形图像;W indows中图法分类号:TP311111 文献标识码:A 文章编号:100123695(2003)0320056204Research and Application of Windows G DI+CHE N Ben2feng,S U Qi(Dept.o f Electronic Engineering&Information Science,Univer sity o f Science&Technology o f China,H e fei Anhui230027,China)Abstract:G DI is the main inter face of W ind ows graphic programming,but it is low functional and tedious.W ith the G DI+coming up,this environment change greatly,the G DI+is an im portant com ponent of M icros Framew ork,which n ot only b oosts up the inter face of W ind ows graphic programming,but als o changes the programming m ode of G DI s oftware development and greatly sim plifies the w orkload of coding.This paper firstly presents the various excellent characteristic of the G DI+on theory aspect,and then intro2 duces h ow to utilize the G DI+.K ey w ords:G DI;G DI+;G raphic;W ind ows1 引言众所周知,在W indows下进行图形图像程序的开发是一件非常烦琐的事,比如显示一幅位图(BMP),需要装入位图、读取位图文件格式头信息、启用设备环境、位传输等等,如果是J PEG,G IF等图像,还需要编写复杂冗长的解码算法,还比如进行各种图像变换、图像处理,以及在动画中实现Alpha混合等图像特效,都需要做大量的代码工作。

这些都是W indows G DI功能的局限性所在。

随着G DI+的出现这一切大为改观,它使W indows 下的图形图像程序开发发生了一次重大的变革。

G DI+是W indows XP操作系统的子系统,负责在屏幕和打印机上显示信息。

顾名思义,G DI+是G DI(W indows早期版本提供的图形设备接口)的后续版本。

G DI+是一种应用程序编程接口(API),通过一套部署为托管代码的类来展现。

这套类被称为G DI+的“托管类接口”。

应用程序的程序员可利用G DI+这样的图形设备接口在屏幕或打印机上显示信息,而不需要考虑特定显示设备的具体情况。

应用程序的程序员调用G DI+类提供的方法,而这些方法又反过来相应地调用特定的设备驱动程序。

G DI+将应用程序与图形硬件隔离,而正是这种隔离允许开发人员创建设备无关的应用程序。

G DI+主要提供了以下三个功能服务:(1)二维矢量图形矢量图形包括坐标系统中的系列点指定的绘图基元(如直线、曲线和图形)。

例如,直线可通过它的两个端点来指定,而矩形可通过确定其左上角位置的点并给出其宽度和高度的一对数字来指定。

简单路径可由通过直线连接的点的数组来指定。

贝塞尔样条是由四个控制点指定的复杂曲线。

G DI+提供了存储基元自身相关信息的类(结构)、存储基元绘制方式相关信息的类,以及实际进行绘制的类。

例如,Rectangle结构存储矩形的位置和尺寸;Pen类存储有关线条颜色、线条粗细和线型的信息;而G raphics 类具有用于绘制直线、矩形、路径和其它图形的方法。

还有几种Brush类,它们存储有关如何使用颜色或图案来填充封闭图形和路径的信息。

用户可以在图元文件中记录矢量图像(图形命令的序列)。

G DI+提供了M etafile类,可用于记录、显示和保存图元文件。

M etafileHeader和M etaHeader类允许您检查图元文件头中存储的数据。

(2)图像处理某些种类的图片很难或者根本无法用矢量图形技收稿日期:2002206207;修返日期:2002207226术来显示。

例如,工具栏按钮上的图片和显示为图标的图片就难以指定为直线和曲线的集合。

拥挤的棒球运动场的高分辨率数字照片会更难以使用矢量技术来制作。

这种类型的图像可存储为位图,即代表屏幕上单个点颜色的数字数组。

G DI +提供了Bitmap 类,可用于显示、操作和保存位图。

(3)文字显示版式就是使用各种字体、字号和样式来显示文本。

G DI +为这种复杂任务提供了大量的支持。

G DI +中的新功能之一是子像素消除锯齿,它可以使文本在LC D 屏幕上呈现时显得比较平滑。

本文首先介绍G DI +的几个主要新增的特性及其功能,然后说明它给W indows 图形图像程序的开发模式带来的变化,最后给出代码实例,介绍如何在VC ++6.0中使用G DI +进行程序开发。

2 G DI +的新增特性(1)渐变的画刷(G radient Brushes )通过提供用于填充图形、路径和区域的线性渐变画笔和路径渐变画笔,G DI +扩展了G DI 的功能。

渐变画笔还可用于绘制直线、曲线和路径。

线性渐变画笔可用于使用颜色来填充图形,画笔在图形中移动时,颜色会逐渐改变。

例如,假定通过指定图形左边为蓝色、右边为绿色创建了一个水平渐变画笔。

当用水平渐变画笔填充该图形时,随着画笔从图形的左边移至右边,颜色就会由蓝色逐渐变为绿色。

用类似方法定义的垂直渐变画笔填充的图形,颜色从上到下变化。

图1显示了用水平渐变画笔填充的椭圆和用斜式渐变画笔填充的区域。

用路径渐变画笔填充图形时,可选择不同的方法来指定当从图形的一部分至另一部分移动画笔时颜色的变化方式。

一种选择是指定中心颜色和边缘颜色,在从图形中间向外边缘移动画笔时,像素逐渐从一种颜色变化到另一种颜色。

图2显示了用路径渐变画笔填充的路径(该路径是用一对贝塞尔样条创建的)。

(2)基数样条函数(Cardinal S pines )G DI +支持在G DI 中不支持的基数样条。

基数样条是一连串单独的曲线,这些曲线连接起来形成一条较大的曲线。

样条由点的数组指定,并通过该数组中的每一个点。

基数样条平滑地(没有锐角)通过数组中的每一个点,因此,比通过连接直线创建的路径更精准。

图3显示了两个路径:一个以基数样条的形式创建;另一个通过连接直线创建。

(3)持久的路径对象(Persistent Path Objects )在G DI 中,路径属于设备上下文,并且会在绘制时被毁坏。

利用G DI +,绘图由G raphics 对象执行,可以创建并维护几个与G raphics 对象分开的G raphicsPath 对象。

绘图操作不会破坏G raphicsPath 对象,因此可以多次使用同一个G raphicsPath 对象来绘制路径。

(4)变形和矩阵对象(T rans formations &M atrix Object )G DI +提供了M atrix 对象,它是一种可以使变形(旋转、平移等)简易灵活的强大工具。

矩阵对象与所变形对象联合使用。

例如,G raphicsPath 对象具有T rans form 方法,此方法接收M atrix 对象作为参数。

单一的3×3矩阵可存储一种变形或一个变形序列。

图4显示了一个路径在执行两种变形前后的情况。

(5)可伸缩区域(Scalable Regions )G DI+通过对区域的支持极大地扩展了G DI 。

在G DI 中,区域存储在设备坐标中,而且,可应用于区域的惟一变形是平移。

G DI +在全局坐标中存储区域,且允许区域发生任何可存储在变形矩阵中的变形(如缩放)。

图5显示一个区域在执行三种变形(缩放、旋转和平移)前后的情况。

(6)Alpha 混合(Alpha Blending )在图5中,可以在变形区域(用蓝色阴影画笔填充)中看到未变形区域(用红色填充)。

这是由G DI +支持的Alpha 混合实现的。

使用Alpha 混合,可以指定填充颜色的透明度。

透明色与背景色相混合———填充色越透明,透出的背景色就越多。

图6显示四个用相同颜色(红色)填充、但透明层次不同的椭圆。

(7)丰富的图像格式支持G DI +提供Image ,Bitmap 和M etafile 类,可以用不同的格式加载、保存和操作图像。

G DI +支持BMP ,G IF ,J PEG,EXIF ,PNG,TIFF ,IC ON ,W MF ,E MF 共九种常用的W indows 图像格式。

3 编程模式的改变G DI +的出现也使基于G DI 的编程模式产生了比较大的变化,主要体现在以下几个方面:(1)设备上下文、句柄和图形对象如果您使用过G DI (W indows 的以前版本中包括的图形设备接口)编写程序,就会熟悉设备上下文的知识。

设备上下文是W indows 使用的一种结构,用于存储与特殊显示设备的功能和指定如何在该设备上绘制项目的属性相关的信息。

用于视频显示的设备上下文还与显示的特定窗口关联。

首先,获得一个设备上下文的句柄(H DC ),然后将该句柄作为参数传递至实际进行绘制的G DI 函数。

还可将此句柄作为参数传递给获取或设置设备上下文属性的G DI 函数。

使用G DI +,不需要再使用句柄或设备上下文,而是只需创建一个G raphics 对象,然后用熟悉的面向对象样式myG raphicsObject.Draw Line (参数)中调用其方法。

正如设备上下文位于G DI的核心,G raphics对象也位于G DI+的核心。

相关文档
最新文档