Windows程序GDI绘图
- 格式:ppt
- 大小:3.04 MB
- 文档页数:92
一、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),用来将某个窗口或设备与设备环境类的句柄指针关联起来,所有的绘图操作都与该句柄有关。
深入浅出windows api程序设计Windows API程序设计是指使用Windows API(应用程序接口)编写程序,而WindowsAPI 是一组允许我们实现Windows上的应用程序的函数和数据结构。
使用Windows API能够充分利用Windows操作系统的各种功能,编写出非常复杂和高效的Windows程序。
本篇文章将介绍Windows API程序设计的基础知识。
1. 程序的入口点2. 创建窗口在Windows API程序中,我们通常需要创建一个程序窗口。
窗口是操作系统提供给我们的一个用于显示信息、输入信息等用户界面,它是我们与操作系统交互的桥梁。
因此,创建一个窗口是非常重要的。
创建窗口的函数是CreateWindowEx,这个函数接受很多参数,包括窗口的大小、位置、样式等。
使用CreateWindowEx函数创建窗口后,我们就可以利用其他的窗口相关函数,如ShowWindow函数和UpdateWindow函数,展示和更新窗口。
3. 窗口消息处理在Windows API程序中,窗口消息处理是窗口程序的核心部分。
这个过程是指Windows 操作系统向窗口程序发送消息,窗口程序根据消息类型进行处理,然后返回一个结果给操作系统以告知消息的处理结果。
窗口消息处理是一个无限循环,我们通过调用GetMessage函数来获得窗口的消息,并且在消息循环中通过调用TranslateMessage和DispatchMessage函数进行消息翻译和转发。
同时,我们可以自定义窗口消息处理函数,用于处理我们自己定义的消息。
4. 绘图Windows API程序中的绘图通常使用GDI(图形设备接口),它是Windows操作系统提供的一个绘图管理系统,提供了许多函数和数据结构,用于绘制各种图形。
GDI操作基本分为一个创建DC设备上下文句柄,两种操作:一种是绘制图形到DC设备上下文中,另一种是从设备上下文中提取数据。
实验4 Windows绘图实验目的1、掌握设备描述表2、掌握CDC类和CGDIObject类及其派生类的应用3、掌握CFont类的一个用4、定时器的应用与定时消息的处理实验内容:本节主要掌握Windows的绘图功能,主要内容包括图形设备接口、CDC类和CGDIObject 类、用CDC类进行图形绘制、用CGDIObject类的派生类CPen类和CBrush类进行绘图。
还讲述了用CGDIObject类的派生类CFont类设置字体以及用定时器实现简单的动画效果。
1.设备描述表设备描述表(Device Context)是一个用来确定任何设备的GDI出书的位置和形象属性的集合。
应用程序病不能直接访问设备描述表,但是应用程序可以使用设备描述表的句柄来间接地存取设备描述表及其属性。
创建的设备描述表包含了它所有的属性和默认值。
在Windows环境下,所有图形文字的输出都是基于坐标系统的,图形坐标系统与基于文本的函数所使用的坐标系统是一致的。
默认的坐标系统以用户区域的左上角为原点,向右的每一个像素表示沿正X轴的一个单位,向下的每一个像素表示沿正Y轴的一个单位。
3.绘图工具绘图工具包括画线的画笔、填充图形内部以及书写正文的字体工具。
所有这些工具的使用都要经过3个步骤,即建立工具、选择工具和使用完后删除相应的工具。
4.CDC类和CGDIObject类CDC类封装了Windows的DC(设备描述表),是MFC设备环境类的基类,其他的MFC设备环境类都是CDC类的派生类。
CDC类指针的生成是用GetDC()函数来实现的,CDC类指针的销毁是用ReleaseDC()函数来实现的。
如:CDC *pDC=GetDC();ReleaseDC(pDC);CGDIObject类及其派生类只封装了GDI中的部分实体,所以CGDIObject类和GDI并不具有想CDC类和DC那样的对应关系。
CGDIObject类具有以下几个主要派生类:CBitmap:位图CBrush类:画刷CPen类:画笔CPalette类:调色板CFont类:字体CRgn类:区域构造CGDIObject派生类的对象通用有两种方法:(一)一步构造法。
第4卷图形驱动程序设计指南第1部分图形驱动程序第2部分显示器及视频微端口驱动程序第3部分打印机驱动程序及假脱机打印部件第1部分图形驱动程序第1章图形系统概述第2章 GDI支持的图形驱动程序第3章对DDI的支持第1章图形系统概述Microsoft Windows NT®/Windows 2000提供了一个健壮的图形体系结构,使第三方图形硬件公司能很容易地集成其视频显示器和打印设备。
本书为编写有效的图形驱动程序提供了设计指南。
可分为以下几个部分:▪Part 1:图形驱动程序Part 1描述了图形驱动程序接口(GDI)和设备驱动程序接口(DDI),讨论了显示器和打印机驱动程序公共的设计和实现细节。
▪Part 2:显示器和视频微端口驱动程序Part 2描述了Windows NT/Windows 2000的视频显示器环境,为显示器和视频微端口驱动程序编写者提供了设计和实现细节。
▪Part 3:打印机驱动程序和假脱机打印部件Part 3描述了构成Windows NT/Windows 2000打印环境的驱动程序和假脱机打印部件,解释了如何提供驱动程序和假脱机打印部件的定制,以提供对新的打印机硬件和网络配置的支持。
▪Part 4:静态映像驱动程序Part 4可以在在线DDK上找到,描述了用Microsoft静态映像体系结构(Microsoft STI)定义的COM接口,这对提供平板扫描仪和数字静态映像相机这些静态映像硬件的供应商是有用的。
图形驱动程序的术语表,在在线DDK上Design Guide的结尾可以找到,对图形子系统和驱动程序设计定义了详细的术语和缩略语。
图形驱动程序函数参考可以在在线DDK的Graphics Driver Reference中找到。
1.1 文档约定本书使用的字体约定和所有其他的Microsoft Windows® 2000 DDK书中的约定是一样的。
这些约定在驱动程序编写者指南中描述。
第14章 GDI+编程基础GDI+(Graphics Device Interface Plus,图形设备接口加)是Windows XP及以上版本操作系统的图形子系统,也是.NET框架的重要组成部分和窗体绘图的主要工具,负责在屏幕和打印机上绘制图形图像和显示信息。
顾名思义,GDI+是Windows早期版本所提供的图形设备接口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++和托管两种封装。
1.GDI+的体系结构GDI+与GDI一样,都具有设备无关性。
而且GDI+是建立在GDI之上的一种高层接口,供Windows API 和.NET 框架调用。
gdi 写文本基本用法在 GDI+ 中,可以使用 Graphics 类来绘制文本。
以下是一个简单的示例,演示了如何在 Windows Forms 应用程序中使用 GDI+ 绘制文本:首先,需要创建一个 Windows Forms 应用程序,并在窗体上添加一个 PictureBox 控件。
然后,在窗体的 Paint 事件中编写以下代码:cprivate void Form1_Paint(object sender, PaintEventArgs e){Graphics g = e.Graphics;string text = "Hello, world!";Font font = new Font("Arial", 12);PointF point = new PointF(50, 50);// 设置文本的格式TextFormatFlags flags = TextFormatFlags.Left | TextFormatFlags.VerticalCenter;// 绘制文本g.DrawString(text, font, Brushes.Black, point, flags);}这段代码首先创建了一个 Graphics 对象,该对象表示窗体上的绘图表面。
然后,定义了一个字符串变量 text,用于存储要绘制的文本。
接着,创建了一个 Font 对象,该对象表示要使用的字体和字体大小。
然后,定义了一个 PointF 对象,该对象表示文本的起始位置。
最后,使用 TextFormatFlags 枚举来设置文本的对齐方式和垂直对齐方式,并使用Graphics 对象的 DrawString 方法将文本绘制到窗体上。
在上面的代码中,我们使用了 Arial 字体和黑色画刷来绘制文本。
当然,您可以使用其他字体、颜色和样式来绘制文本,以满足您的需求。
对Windows程序中设备上下文DC(device context)的理解:DC实际上是GDI内部保存的数据结构。
DC与特定的显示设备(如显示器或打印机)相关。
对于显示器,DC总是与显示器上的特定视窗相关。
DC中的有些值是图形「属性」,这些属性定义了GDI绘图函数工作的细节。
例如,对於TextOut,DC的属性确定了文字的颜色、文字的背景色、x座标和y座标映射到视窗的显示区域的方式,以及显示文字时Windows使用的字体。
MSDN的解释: 一个DC是一个结构,它定义了一系列图形对象的集合以及它们相关的属性,以及影响输出效果的一些图形模式。
这些图形对象包括一个画线的笔,一个填充和painting的画刷,一个用来向屏幕拷贝的位图,一个定义了一系列颜色集合的调色板,一个用来剪裁等操作的区域,一个做painting和drawing操作的路径。
一个应用程序从不直接地访问(access)dc,常见的取得dc的方式有以下几种:SDK's way:1. BeginPaintcase WM_PAINT: HDC hdc = BeginPaint(hwnd, &ps); EndPaint(hwnd, &ps); MSDN的解释: BeginPaint函数自动地设置dc的剪裁区域,这个剪裁区域,剪裁的是由Inv alidateRect 或InvalidateRgn 函数触发的窗口无效区域,或者是系统给出的无效区域,当窗口被sizing, moving, creating, scrolling, or any other operation that affects the client area.一个应用程序从不调用BeginPaint,除了在收到一个WM_PAINT消息的时候;每一BeginP aint调用之后,需要调用EndPaint函数。
2.GetXXXDCGetDC取得与窗口客户区相关的dc,GetWindowDC取得与整个窗口(包括客户区和非客户区)相关的dc。
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 判断当前字体颜色。
onpaint函数
onPaint函数是Windows系统中的重要绘图函数,它可以让其他程序绘制图形
界面(Graphical User Interface,GUI)。
它是构建动态、用户友好的程序界面的技术主管,甚至是构建多媒体应用的关键。
它是使用囱头的程序员们所受益最多的
一款重要工具。
onPaint函数可以提供程序编写者们建立静态和动态图形视觉效果的强大能力。
它使用画布和画笔来绘制无边框窗口,内部可以安装任意颜色、轮廓和文本等。
它通过定义平面二维或三维坐标系来帮助程序更好地描述窗口组件。
另外,还包括
了图片变形算法、图像打印技术和窗口水平滚动等功能,从而使用户能够得到更高效的体验,特别是在处理大量的图像数据时。
onPaint函数还可以和GDI(囱头设备独立技术)相结合,通过使用GDI可以
更容易地实现复杂的图形,比如圆形、椭圆形、三维柱状形等等,从而快速实现理想的图形效果,同时得到更佳的显示效果。
onPaint函数是 Windows 平台上的重要绘图函数,它的出现大大提升了Windows应用的用户体验,也为程序员打开了基于GUI的程序开发的大门,使得
开发大型复杂的跨平台软件更加容易。
它也为应用程序开发提供了非常可观的便利,比如可以轻松创建任何复杂的图形,以及能够与GDI结合使用,加速完成图形交
互性界面的设计。
onPaint函数在整个应用开发中发挥了无可取代的作用,促成了当下GUI视觉程序技术的大发展。