【新书推荐】Windows GDI绘图
yuyutoo 2024-11-26 10:38 2 浏览 0 评论
本章我们将学习GDI绘图的基础知识。在第一章的1.2节讲述了GDI32.DLL动态链接库包含了Windows所有绘图API函数,由几百个函数以及相关的一些数据类型、宏和结构组成。本章将讲述如何使用GDI绘图,获取设备环境信息,使用点和线绘制基本图形,如何填充多边形区域,GDI映射模式和矩形、区域、裁剪。
本章学习知识概要:
GDI绘图
设备环境
点和线的绘制
绘制填充区域
GDI映射模式
矩形、区域和裁剪
4.1 GDI绘图
本节必须掌握的知识点:
GDI原理
GDI函数调用
GDI基本图形
4.1.1 GDI原理
GDI,全称是Graphics Device Interface(图形设备接口),是微软Windows操作系统中提供的一套用于渲染图形和格式化文本的API(应用程序接口)。GDI提供了一种相对简单的方式来进行二维图形绘制,包括线段、矩形、椭圆、多边形、位图和文本等。
GDI的核心原理涉及到了以下几个重要的内容:
1.设备上下文(Device Context,DC):设备上下文是GDI的核心概念,它是一个数据结构,包含了在设备中绘图的所有信息。包括绘图的颜色、字体、绘图模式等等。当你想要在窗口或者位图上绘图时,需要先获取或者创建对应的设备上下文。
2.GDI对象:GDI使用了许多不同的GDI对象来代表绘图的各个方面。例如,使用画笔(Pen)对象来表示线条的颜色和粗细,使用字体(Font)对象来表示字体等等。在需要绘制图形或者文本时,需要先创建并选择对应的GDI对象到设备上下文中。
3.绘图函数:GDI提供了一系列的函数来进行图形和文本的绘制。例如,LineTo函数用于绘制线段,Rectangle函数用于绘制矩形,TextOut函数用于输出文本等等。这些函数根据设备上下文中当前选择的GDI对象来执行绘图动作。
4.坐标系和变换:GDI使用坐标系来确定绘制图形的位置,包括设备坐标、逻辑坐标和窗口坐标等。GDI还提供了变换函数,如缩放、旋转和平移等,可以改变绘制物体的位置和形状。
总的来说,GDI是Windows操作系统中的一个重要组成部分,它提供了一套API来处理图形、文本和图像等图形操作。通过使用GDI,开发者可以实现各种图形和界面效果,使应用程序具有更丰富的视觉体验。
GDI的一个主要目的就是支持与设备无关的图形。 Windows程序应当毫无问题地在 Windows所支持的任何图形设备上输出。GDI提供了一种特殊的机制来彻底隔离应用程序和不同输出设备的特性,这样就可以支持与设备无关的图形。
图形输出设备被分为两大类:光栅设备( raster device)和矢量设备 vector device。大多数PC输出设备是光栅设备,这也就意味着它们将图像表示成以点的形式构成的矩阵。该类输出设备有视频显示适配器、点阵打印机和激光打印机。矢量设备则使用线条来绘制图通常指绘图机 。
大多数传统地计算机图形程序完全以矢量为主。输出设备使用像素表示图形,但程序并不以像素的形式来调用输出设备的接口函数。Windows GDI可以看作是一个高层的矢量绘制系统来使用,也可以使用它来进行相对底层的像素操作。
在这个方面来看,Windows GDI与传统图形接口语言之间的关系类似于 C与其他编程语言的关系。C的闻名之处在于它在不同操作系统和环境之间的高度可移植性。还有就是允许程序员执行底层系统函数,这是其他高级语言做不到的。就如图C常被当成“高级汇编语言”一样,你可以把GDI当成图形设备硬件的一种高层接口。
如前所述, Windows默认使用以像素为单位的坐标系统。大多数传统的图形语言都使用一个“虚拟”坐标系统,它的横轴和纵轴的范围是0~32767。尽管一些图形语言并不允许使用像素坐标,但是 Windows GDI允许使用任何一种坐标系统(可以使用其他依据物理测量得到的坐标系统),所以你可以使用虚拟坐标系统来保证程序与硬件独立,也可以使用设备坐标系统来完全迎合硬件的需求。
4.1.2 GDI函数调用
在Windows编程中,GDI(图形设备接口)的函数主要可以分为以下几个类别:
●设备上下文(Device Context)函数:包括获取和释放设备上下文(如GetDC、ReleaseDC),保存和恢复设备上下文状态(如SaveDC、RestoreDC)。
●GDI对象函数:创建和删除画笔、画刷、字体等GDI对象(如CreatePen、CreateBrush、CreateFont),选择这些对象进入设备上下文(如SelectObject),以及获取和设置这些对象的属性(如GetLogPen、SetLogBrush)。
●绘图函数:用来绘制线条、形状和图像,如LineTo、Rectangle、Ellipse、Polygon,以及BitBlt、StretchBlt等。
●文本输出函数:显示文本,以及对文本进行格式化、计算大小等,像TextOut,DrawText,GetTextExtentPoint32等。
●坐标和变换函数:进行坐标变换,包括设置视口和窗口,以及世界变换,包括SetViewportOrgEx,SetWindowExtEx,SetWorldTransform等等。
●裁剪和区域函数:定义和使用复杂的裁剪区域,像SelectClipRgn,CreateRectRgn等。
●滚动条和画面滚动函数:用于处理滚动条和滚动视图,包括ScrollWindow,SetScrollInfo,GetScrollInfo等。
●绘图控制函数:这些函数用于操作颜色和设置模式,例如SetBkMode,SetBkColor,SetTextColor等。
所有这些函数都可以在微软官方MSDN网址上找到详细说明和示例。
4.1.3 GDI基本图形
在GDI(图形设备接口)中,一些基本的图形包括线(Line)、矩形(Rectangle)、圆(Circle)、椭圆(Ellipse)、多边形(Polygon)、多线段(Polyline)等等。
■基本图形:
◆线:使用MoveToEx函数来设置起始点,然后使用LineTo函数来绘制一条从起始点到指定点的线段。
◆矩形:使用Rectangle函数来绘制一个矩形,参数指定了矩形的左上角和右下角的位置。
◆圆和椭圆:使用Ellipse函数来绘制一个椭圆,参数同样指定了椭圆所在的矩形的左上角和右下角的位置。如果该矩形是正方形,那么绘制出的椭圆就是一个圆。
◆多边形:使用Polygon函数来绘制一个多边形。你需要指定一个点数组,其中每个点表示多边形的一个顶点,然后GDI会按照顶点的顺序连接线段,并自动连接第一个点和最后一个点来关闭多边形。
◆多线段:使用Polyline函数来绘制一系列的线段。和Polygon一样,你会提供一个点数组,但是GDI仅仅只是按顺序连接这些点,而并不会尝试去关闭图形。
◆可被填充的封闭区域。当一系列的线条或者曲线构成一个封闭区域时,你可以使用当前GDI的画刷对象填充这个区域。这个画刷可以是纯色的,或者是使用某种填充模式(如一系列水平的、垂直的或者倾斜的图案),还可以是在水平或垂直方向不停重复的位图图像。
◆位图。位图是一个二维的位数组,每一个元素都对应显示设备上的一个像素,是光栅图形的基础。位图通常用于在显示器或者打印机上显示复杂(通常是真实世界)的图像。位图也通常用于显示必须要快速绘制的小图像,例如图标、鼠标指针以及出现在应用程序工具栏里的按钮。GDl支持两种类型的位图:旧式的(尽管现在仍然十分常用)“设备相关”位图(它属于GDI对象)和新式的(从Windows3.0起)“设备无关”位图(DIB)。DIB可以存放在磁盘文件中。我将在第章和第十四章讨论位图。
◆文本。文本通常是任何计算机图形系统中最复杂的部分。在所有 Windows的数据结构中,用于定义GDI字体对象和获取字体信息的数据结构是最庞大的。GDI从 Windows3.1开始支持 TrueType字体,这种字体是以填充的轮廓线为基础的,某些GDI函数可以操控这些轮廓线。 Windows98还继续支持旧式的基于位图的字体,因为它的兼容性较好,对内存需求也小。我们将在第十六章讨论字体。
所有这些图形的颜色和样式由当前选择进设备上下文(Device Context)的画笔(Pen)和画刷(Brush)决定。你可以使用CreatePen,CreateSolidBrush等函数来创建画笔和画刷,并使用SelectObject函数来选择它们。
■GDI的其他方面:
◆映射模式(mapping mode)和转换( transform)。尽管在默认时是以像素为单位进行绘制的,但并不是别无选择。GDI的映射模式允许以英寸(甚至几分之一英寸)、毫米或者其他你所想要的任何单位进行绘制。
◆图元文件( metafile)。一个图元文件是以二进制形式存储的GDI命令的集合。图元文件主要用于通过剪贴板转换矢量图形绘制的表现形式。我将在第十七章讨论图元。
◆区域( region)。区域是一个任意形状的封闭图形,通常可以表示为由一系列简单区域进行布尔运算后得到的结果。在GDI内部,可以使用一个从已知区域出发的一系列扫描线来定义一个复杂的区域。可以使用区域进行轮廓绘制、填充或者剪裁。
◆路径(path)。路径是存储在GDI内部的直线和曲线的集合。可以用于绘制、填充和剪裁。路径还可以转换为区域。
◆剪裁( (clipping)。当绘图被限制在客户区的一个特定的空间位置时,就发生了剪裁。那个特定的空间位置可以是矩形或者非矩形,它通常被指定为一个区域或者一个路径。
◆调色板( palettes)。仅在支持256种颜色时,才能使用自定义的调色板。 Windows仅保留其中的20种色彩以供系统使用。你可以改变其他236种色彩,这样就可以准确显示按位图形式存储的真实图像。我将在第十五章讨论调色板。
◆打印 printing)。尽管本章只讨论视频显示器。但在本章学到的所有知识几乎都可以应用于打印机。我将在第十三章讨论打印机。
本文摘自编程达人系列教材《Windows API每日一练》Windows程序设计基础。
相关推荐
- 史上最全的浏览器兼容性问题和解决方案
-
微信ID:WEB_wysj(点击关注)◎◎◎◎◎◎◎◎◎一┳═┻︻▄(页底留言开放,欢迎来吐槽)●●●...
-
- 平面设计基础知识_平面设计基础知识实验收获与总结
-
CSS构造颜色,背景与图像1.使用span更好的控制文本中局部区域的文本:文本;2.使用display属性提供区块转变:display:inline(是内联的...
-
2025-02-21 16:01 yuyutoo
- 写作排版简单三步就行-工具篇_作文排版模板
-
和我们工作中日常word排版内部交流不同,这篇教程介绍的写作排版主要是用于“微信公众号、头条号”网络展示。写作展现的是我的思考,排版是让写作在网格上更好地展现。在写作上花费时间是有累积复利优势的,在排...
- 写一个2048的游戏_2048小游戏功能实现
-
1.创建HTML文件1.打开一个文本编辑器,例如Notepad++、SublimeText、VisualStudioCode等。2.将以下HTML代码复制并粘贴到文本编辑器中:html...
- 今天你穿“短袖”了吗?青岛最高23℃!接下来几天气温更刺激……
-
最近的天气暖和得让很多小伙伴们喊“热”!!! 昨天的气温到底升得有多高呢?你家有没有榜上有名?...
- CSS不规则卡片,纯CSS制作优惠券样式,CSS实现锯齿样式
-
之前也有写过CSS优惠券样式《CSS3径向渐变实现优惠券波浪造型》,这次再来温习一遍,并且将更为详细的讲解,从布局到具体样式说明,最后定义CSS变量,自定义主题颜色。布局...
- 你的自我界限够强大吗?_你的自我界限够强大吗英文
-
我的结果:A、该设立新的界限...
- 行内元素与块级元素,以及区别_行内元素和块级元素有什么区别?
-
行内元素与块级元素首先,CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值,分别为块级(block)、行内(inline)。块级元素:(以下列举比较常...
-
- 让“成都速度”跑得潇潇洒洒,地上地下共享轨交繁华
-
去年的两会期间,习近平总书记在参加人大会议四川代表团审议时,对治蜀兴川提出了明确要求,指明了前行方向,并带来了“祝四川人民的生活越来越安逸”的美好祝福。又是一年...
-
2025-02-21 16:00 yuyutoo
- 今年国家综合性消防救援队伍计划招录消防员15000名
-
记者24日从应急管理部获悉,国家综合性消防救援队伍2023年消防员招录工作已正式启动。今年共计划招录消防员15000名,其中高校应届毕业生5000名、退役士兵5000名、社会青年5000名。本次招录的...
- 一起盘点最新 Chrome v133 的5大主流特性 ?
-
1.CSS的高级attr()方法CSSattr()函数是CSSLevel5中用于检索DOM元素的属性值并将其用于CSS属性值,类似于var()函数替换自定义属性值的方式。...
- 竞走团体世锦赛5月太仓举行 世界冠军杨家玉担任形象大使
-
style="text-align:center;"data-mce-style="text-align:...
- 学物理能做什么?_学物理能做什么 卢昌海
-
作者:曹则贤中国科学院物理研究所原标题:《物理学:ASourceofPowerforMan》在2006年中央电视台《对话》栏目的某期节目中,主持人问过我一个的问题:“学物理的人,如果日后不...
-
- 你不知道的关于这只眯眼兔的6个小秘密
-
在你们忙着给熊本君做表情包的时候,要知道,最先在网络上引起轰动的可是这只脸上只有两条缝的兔子——兔斯基。今年,它更是迎来了自己的10岁生日。①关于德艺双馨“老艺...
-
2025-02-21 16:00 yuyutoo
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)