图形设备接口
关于GDI 打印机与PDL 打印机的比较
关于GDI打印机与PDL打印机的比较:GDI打印机(Graphical Device Interface 图形设备接口)是一种在 MS WINDOWS成为普遍操作系统后,出现的新型打印控制语言。
说它是一种打印语言有点牵强。
实际上,它是利用GUI(Graphical User Interface 图形用户界面)自带资源实施打印作业的传输、解释、和RIP(Raster Image Process 光栅图象处理过程)的标准设备接口。
GDI的工作流程简单来说,是文件在WINDOWS中利用PC机的主芯片、内存进行打印作业的处理过程,而下端打印机只是简单的输出光栅图象。
所以GDI打印机的性能,主要取决于上端的WINDOWS系统资源,和PC机的硬件资源;而不取决于打印机本身的软硬件资源,打印机只通过引擎决定引擎打印速度,打印机的内存只用于简单的图象驻留。
简单的举例,用WINDOWS 98 就比用WINDOWS 3.1打印同一文件快;128MB的PC就比32MB的PC在同一系统下、打印同一文件快;在同一PC同一系统下,一台1MB 内存的打印机和一台10MB的打印机打印速度没有大的区别;而当您的WINDOWS 剩余硬盘空间太小,或驻留内存的文件过多,打印机在一切正常的情况下,也会降低打印速度。
GDI 基本使用于个人机和多功能打印机,在喷墨机中较广泛。
PDL打印机(Page Description Language 页面描述语言)是使用标准打印语言的打印机,也是业界广泛推行的打印机。
它的工作流程主要是通过打印驱动管理打印机的内部软硬件资源,将打印作业指向特定的接口和解释器,作业将使用打印机的内部资源进行处理、解释、RIP并输出。
由于PDL是一种标准编程语言,它可以根据特定的系统进行定制、或二次改编,所以PDL打印机可适应多种系统,可允许客户根据自身的软件定制功能;又因为PDL打印机的处理过程大部分在打印机本身,所以在各功能上可进行扩充。
图形设备接口及绘图
§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
图形设备接口及绘图
设备驱动层负责与具体的图形设 备进行交互,将GDI核心层发送的 图形指令转换为设备可以理解的 指令,并控制设备进行渲染。
GDI的结构主要包括三个层次:应 用程序接口层、GD负责将应用程序的图形 操作转换为相应的图形指令,并 管理图形设备的资源,如内存、 颜色表等。
技术创新方向预测
跨平台兼容性增强
随着不同操作系统和设备的普及,图形设备接口将更加注重跨平 台兼容性,实现无缝的跨平台用户体验。
实时渲染技术优化
借助更强大的计算能力和先进的算法,图形设备接口将进一步提高 实时渲染的质量和效率。
AI驱动的智能图形处理
结合人工智能技术,图形设备接口将实现更智能的图形处理,包括 自动优化、智能缩放、场景识别等功能。
图形设备接口及绘图
目录
• 图形设备接口概述 • 图形设备接口原理及结构 • 绘图基本操作与功能 • 高级绘图技巧与方法 • 图形设备接口在应用领域中的实践 • 图形设备接口未来发展趋势与挑战
01 图形设备接口概述
定义与功能
定义
图形设备接口(Graphics Device Interface,GDI)是一种应用程序编 程接口(API),用于在计算机图形环 境中表示图形和文字。
标准
为了规范GDI的开发和使用,国际标准化组织(ISO) 和国际电工委员会(IEC)等制定了一系列相关标准, 如OpenGL、DirectX等。这些标准为不同平台和设 备上的GDI实现提供了统一的接口和规范,促进了 GDI的互操作性和可移植性。
02 图形设备接口原理及结构
工作原理简介
图形设备接口(GDI)是计算机图形学中的一个重要概念, 它提供了一种与图形硬件设备进行交互的抽象层。
图像处理
反走样技术
第13章 图形用户接口
13.3.1 MiniGUI
MiniGUI是1998年底推出的一款面向嵌入式系统或者实时系统的GUI系统, 是国内最早出现的、在国际上有一定知名度的几个自由软件项目之一, 最先是由原清华大学教师魏永明先生主持开发,现由北京飞漫软件技术 有限公司()进行商业化维护和运作。自1999 年初以遵循 GPL 协议发布第一个版本以来,到现在已历经十年多时间, 目前最新版本是MiniGUI V3.0.12。经过飞漫软件多年的精心打造, MiniGUI 已经成为性能优良、功能丰富的跨操作系统嵌入式图形用户界 面支持系统。目前,MiniGUI 已经广泛应用于通讯、医疗、工控、电力、 机顶盒、多媒体终端等领域。一些企业如华为、中兴通讯、大唐移动、 长虹等已经成功的使用 MiniGUI进行产品开发,约有 60% 获得入网许可 证的 TD-SCDMA 手机使用 MiniGUI 作为其嵌入式图形平台,以支撑浏 览器、可视电话等 3G 应用软件的运行。
5. 《MiniGUI API 参考手册》V3.0.12 进程版
6. 《MiniGUI API 参考手册》V3.0.12 线程版 7. 《MiniGUI API 参考手册》V3.0.12 单机版 8. 《mGPlus API 参考手册》V1.2.4
13.3.2 Qtopia
Qtopia是嵌入式GUI窗口系统,也叫做嵌入式Linux的桌面
13.1.3 GUI窗口管理系统
GUI窗口管理系统是一个非常复杂的系统,很多时候
甚至就类似于一个操作系统,它是嵌入式系统设计中迄今 为止没有很好解决的难点之一。目前,在桌面GUI系统领 域主要有X-Windows、KDE、GNOME等,在嵌入式系统领 域,主要有MiniGUI、Nano-X(Microwindows)、OpenGUI 和Qpe(Qt Palmtop Environment)等。
显卡有几种接口
显卡有几种接口显卡是计算机中一个重要的硬件设备,它负责处理图形和图像数据,并将其显示在计算机屏幕上。
显卡接口是连接显卡和其他设备(如显示器)之间的物理接口,不同的接口具有不同的功能和性能。
下面将介绍几种常见的显卡接口。
1. VGA接口(Video Graphics Array)VGA接口是最早的显卡接口之一,也是目前应用最广泛的接口之一。
它采用15个D-sub针脚连接,传输模拟图像信号。
虽然VGA接口已经过时,但由于兼容性较好,仍然用于一些老式显示器和电视显示设备。
2. DVI接口(Digital Visual Interface)DVI接口是一种数字信号传输接口,它可以传输数字图像信号,还可以通过转换器支持模拟信号。
DVI接口具有更高的图像质量和分辨率,适用于高清显示设备,如LCD显示器和投影仪。
3. HDMI接口(High-Definition Multimedia Interface)HDMI接口是一种数字化音频视频接口,它可以同时传输高清视频和高保真音频信号。
HDMI接口具有较高的传输带宽,支持多通道音频输出,并且可以通过转换器适配其他接口。
HDMI接口广泛应用于电视、显示器、投影仪等高清多媒体设备。
4. DisplayPort接口DisplayPort接口是一种位于笔记本电脑、数码相机和显示器之间的接口标准,支持高清视频和音频传输。
DisplayPort接口的优点包括更高的带宽和更好的色彩深度,可以实现更高的分辨率和刷新率。
5. Thunderbolt接口Thunderbolt接口是由英特尔和苹果公司联合推出的高速数据传输接口。
它采用微型显示端口(Mini DisplayPort)连接,可以同时传输视频、音频和其他数据。
Thunderbolt接口支持高独立刷新率和高分辨率显示,并可以连接多个外部设备,如显示器、硬盘驱动器、音频设备等。
上述介绍的显卡接口是目前常见的几种接口,它们在图像质量、传输带宽、分辨率和兼容性等方面有所差异。
图形设备接口及绘图
✓
绘图函数:Ellipse()…
✓
文本输出:TextOut()SetTextColor()…
✓
数据成员m_hdc:设备描述表句柄。
PPT文档演模板
图形设备接口及绘图
➢CPaintDC:
✓ construction CWnd::BeginPaint ✓ destruction CWnd::EndPaint
);
PPT文档演模板
图形设备接口及绘图
坐标系的转换
1. DPToLP() 2. LPToDP() 3. ClientToScreen() 4. ScreenToClient()
PPT文档演模板
图形设备接口及绘图
3.8 使用CDC类绘制图形
• 绘制点和线
–COLORREF SetPixel( POINT point, COLORREF crColor );
PPT文档演模板
hNewPen=(HPEN)SelectObject(hdc,hOldPen);
DeleteObject(hNewPen);
EndPaint(hWnd, &ps);
break;
图形设备接口及绘图
使用CGDIObject类
• 数据成员m_hObject • Attach函数 Detach函数 • 派生类: CPen、CBrush、CFont、
–CPoint MoveTo( POINT point ); –BOOL LineTo( POINT point );
PPT文档演模板
–BOOL Arc( LPCRECT lpRect, POINT ptStart, POINT ptEnd );
–BOOL AngleArc( int x, int y, int
图形设备接口概述
图形设备接口概述图形设备接口是计算机硬件设备与图形输出设备之间的连接和通信接口。
图形设备接口的主要作用是将计算机中的图形数据转换成适合输出设备的信号,并将其发送到输出设备上以显示图形图像或执行相关的图形操作。
图形设备接口通常包括以下几个方面的内容:1. 图形处理器:图形设备接口通常会包含一个图形处理器,用于处理计算机中的图形数据。
这些处理器通常会包含专门的图形处理芯片,用于加速图形数据的处理和输出。
2. 显示接口:图形设备接口还会包含一种用于电子设备之间传输图形数据的接口,在电脑显示器和计算机之间传输图形数据,一般有HDMI,VGA,DVI等接口形成一个显示功能。
3. 驱动程序:图形设备接口中还包含了一些用于驱动图形设备的软件程序,在计算机中运行。
这些驱动程序通常由设备制造商提供,用于确保图形设备能够正确地与计算机通信和协作。
4. 输出设备控制:图形设备接口还包含了一些控制输出设备的信号发送、操作和控制。
这些控制信号用于调整显示器的亮度、对比度、色彩等参数。
总之,图形设备接口是计算机硬件设备与图形输出设备之间进行通信的桥梁,它是保证计算机能够正确地输出图形图像的关键接口之一。
图形设备接口在计算机系统中起着至关重要的作用,它不仅仅是连接计算机和输出设备的通信桥梁,同时也能影响到系统的性能、图形处理能力和显示效果。
以下是一些进一步讨论的方向以及图形设备接口的相关内容:1. 图形设备接口的发展历史:历史上,图形设备接口的发展经历了多个阶段。
从最初的模拟VGA接口到后来的数字HDMI和DisplayPort接口,每一代接口的推出都代表着图形设备技术的飞速进步。
这种发展历程可以让我们更好地了解图形设备接口的发展趋势和未来发展方向。
2. 图形设备接口的标准化:随着图形设备的日益普及,图形设备接口的标准化变得尤为重要。
目前,HDMI、DisplayPort、DVI等标准接口已经成为了市场主流,他们相互之间有着一些差异和优势。
gdi路径运算
gdi路径运算
GDI(Graphics Device Interface)是Windows操作系统提供的图形设备接口,用于在屏幕上显示图形或文本。
路径运算是GDI中一种常见的图形处理技术,可以将多个简单的图形组合成一个复杂的图形。
在GDI中,路径是由线段、曲线和其他基本图形元素组成的。
路径运算可以对这些基本元素进行组合、重叠、裁剪和变形等操作,得到一个新的路径。
常见的路径运算包括:
1. Union(并集):将两个路径合并成一个路径。
2. Intersect(交集):获取两个路径的交集部分。
3. Exclude(排除):从第一个路径中排除第二个路径所覆盖的部分。
4. Xor(异或):获取两个路径不重叠的部分。
在GDI中,路径运算通常使用Path类来实现。
Path类提供了一系列方法,可以实现路径的创建、修改和运算等功能。
例如,可以使用AddLine方法添加直线段,使用AddBezier方法添加贝塞尔曲线段,使用AddEllipse方法添加椭圆等。
通过组合使用这些方法,就可以创建出复杂的路径,并进行各种路径运算。
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坐标系中绘制图形和文本。
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()释放设备环境。
pci-e
pci-ePCI-E是指Peripheral Component Interconnect Express的缩写,是一种用于连接计算机主板和外部硬件设备的接口标准。
PCI-E接口是目前计算机主板上最常见的扩展槽之一,广泛应用于图形卡、网卡、声卡等高速数据传输设备的连接。
作为一种高速的扩展接口,PCI-E拥有许多优势。
首先,PCI-E接口的带宽很大,可以支持高速数据传输。
传统的PCI接口速度较慢,无法满足现代计算机对高速数据传输的需求。
而PCI-E接口以其快速的数据传输速率,能够满足计算机处理大量数据的需求。
其次,PCI-E接口具有独立的全双工通信通道。
与传统的PCI接口相比,PCI-E接口可以同时进行传输和接收数据,大大提高了数据的传输效率。
这种独立通道的设计可以有效降低多设备共享带宽时的冲突和资源竞争,提升系统的整体性能。
PCI-E接口还支持热插拔功能。
这意味着用户可以在计算机运行的情况下插入或拔出PCI-E设备,而无需重新启动计算机。
这对于需要频繁更换或添加硬件设备的用户来说非常方便,大大提高了工作效率。
此外,PCI-E接口还具有可靠性和稳定性好的特点。
它采用差分信号传输技术,减少了信号干扰和数据传输错误的可能性。
同时,PCI-E接口还支持误码校验和纠正功能,可以检测和修复传输过程中的错误,提高了数据传输的可靠性。
在实际应用中,PCI-E接口被广泛应用于图形卡和扩展卡等设备的连接。
对于需要进行大量图形处理的用户,如游戏玩家、视频编辑人员等,PCI-E接口能够提供高速的图形数据传输,保证图像的流畅性和清晰度。
另外,通过PCI-E接口扩展的网络卡和声卡等设备,也能够实现高速的数据传输。
无论是办公室网络的需求,还是需要进行音频录制和编辑的用户,PCI-E接口都能够提供稳定且高效的数据传输,满足用户的需求。
总结起来,PCI-E接口作为一种高速的扩展接口,在计算机领域具有广泛的应用前景。
它不仅可以满足大数据传输的需求,还具有独立通道、热插拔、可靠性和稳定性等特点,大大提高了计算机系统的性能和可靠性。
MXM接口——精选推荐
MXM接口MXM接口,即Mobile PCI Express Module,这是一套基于PCI-Express界面的、为图形处理器设计的设备接口,定位于不同类型的笔记本产品,是由nVidia及多家笔记本电脑生产商共同制定,采用和PCI-Express兼容的通讯协议,因此可使用于所有支持PCI-Express规格的绘图核心及支持PCI-Express绘图接口的芯片组,它不止缩短了产品设计的周期,而且厂商可因用户不同需求而提供不同等级的MXM显卡产品,用户则可以根据需要在日后自行升级MXM显卡而无需更换整台笔记本电脑。
MXM,是2004年由NVIDIA提出的整合移动显卡市场的标准.其初衷是帮助各大笔记本生产厂家在现有的模具下升级配置.对于消费者来说,MXM就意味着显卡升级成为可能.起初只有NVIDIA一家的显卡采用了MXM标准,但是ATI也随后跟进,使得消费者在升级显卡的时候有更多的选择.遗憾的是,直到现在,很多笔记本生产大厂在基于多种因素的影响下没有采用这一标准.标准的MXM卡一般有三种制式:I,II,III.(还有一种是HE,不过游戏型移动显卡市面上几乎没有HE 制式的显卡,所以忽略不计)相同制式的显卡可以互换.但是随着科技的进步,DIYER们已经可以把不同制式的MXM卡互相更换了.但是请注意,制式I的显卡只能跟制式I的机型相匹配;制式II可以向下兼容制式I,制式III兼容制式I和II.而HE兼容所有的制式.所以,如果你的机器兼容MXM TYPE III的话,那就意味着你可以更换目前所有的NVIDIA生产的移动显卡(SLI双显卡除外)和部分ATI显卡(比如X1800)下面是已知的移动显卡标准制式MXM制式宽长MXM-I 70 mm 68mm MXM-II 73 mm 78mm MXM-III 82 mm 100 mm MXM-HE 82 mm 100 mm 目前已知的采用制式I的移动显卡包括:GO 6200,GO 6600S,GO7300;ATIX300,X600S和X1300.而高端显卡则多采用制式III.也有的厂商没有采用制式的MXM卡,而是自己制定了新的标准,希望能说服其他大厂加进自己的标准阵营,典型的代表比如ARIMA公司制定的"ARIMA SPECIAL",ASUS公司制定的"KINDA MXM".关于MXM,有几点说明请大家注意:1.PCI EXPRESS X16不等于"MXM"标准.所以PCI-E X16的移动显卡并不一定能自由更换,这是两个完全不同的标准.2.随着科技和DIYER们的进步,在发烧友市场上MXM 1,II,III已经做到了随意相互更换.但如果你是新手又想升级显卡,还是更换同制式的MXM卡吧.3.Acer,Dell,Sony,Panasonic,LG,Lenovo,Apple和Clevo这几个公司的笔记本从来都不使用MXM的移动显卡.用这几个公司机器的朋友恐怕要失望了.4.更换显卡成功后,不用刷新BIOS可以直接使用5.Quanta和Apple(台式机)使用他们独特的proprietary MXM标准,和标准的MXM制式不同6.ARIMA公司有独特的"ARIMA SPECIAL"MXM规格,但是可以和标准的MXM规格相兼容7.ASUS曾经使用过标准的MXM规格(A4/Z81),但是现在已经将标准规格抛弃采用自己独特的"KINDA MXM"规格(A8),是否和标准规格兼容还有待评测.8.HP以前是不采用MXM 卡的,但是新的N9000系列采用了最新的MXM III制式,使得升级显卡到GO 7950 GTX成为可能9.TOSHIBA P100系列正在评测中,预期是带有MXM III制式的显卡.可以看到,能升级显卡的笔记本电脑是如此的少.我在MXM制式列表中找了好久,总算找到几个采用MXM规格又在大陆上市的品牌.品牌机型是否采用标准MXM标准MXM制式规格ASUS Z81S YIII A4S YIII BENQ JOYOBOOKR55 Y?HP NX9420/NW9440 YIII TOSHIBA SATELLITE P105 YIII MXM的特性MXM虽然是由nVidia提出并制订,但却不是nVidia的专利,它是一个公开的MXM接口规格并让其他显卡业界厂商自行使用,因此已有厂商生产非nVidia的MXM模块显卡例如ATI及XGI等等。
什么是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不支持。
gdi+ bitmap指针用法
gdi+ bitmap指针用法GDI(图形设备接口)是Windows操作系统中用于图形输出的接口,广泛应用于Windows应用程序的开发。
Bitmap是一种位图,是一种用于存储图像数据的格式,常用于绘制图形、文字等。
在GDI中,Bitmap对象可以用于绘制各种图形元素,如文本、线条、矩形、椭圆等。
指针是C++等编程语言中用于引用变量的符号,在GDIBitmap中使用指针可以更方便地操作Bitmap对象。
下面将介绍GDIBitmap指针的用法。
一、Bitmap对象的创建和加载在使用Bitmap指针之前,需要先创建或加载Bitmap对象。
可以使用GDI提供的函数如CreateBitmap()或LoadBitmap()来创建Bitmap 对象,并获取其句柄。
二、Bitmap指针的声明和初始化在使用Bitmap指针之前,需要先声明并初始化一个指向Bitmap 对象的指针。
可以使用指向GDI结构体的指针类型如HBITMAP来声明Bitmap指针。
例如:HBITMAPhBitmap=NULL;三、使用Bitmap指针进行操作1.获取Bitmap对象的属性使用Bitmap指针可以获取Bitmap对象的属性,如宽度、高度、颜色深度等。
可以使用GetPixel()函数获取指定坐标处的像素值,使用GetBltRect()函数获取绘制矩形区域等。
2.绘制图形元素使用Bitmap指针可以绘制各种图形元素,如文本、线条、矩形、椭圆等。
可以使用GDI提供的函数如DrawText()、DrawLine()、DrawRect()等在Bitmap上进行绘制。
3.保存Bitmap对象使用Bitmap指针可以将Bitmap对象保存为文件,以便后续使用或保存到本地存储。
可以使用GDI提供的函数如SaveBitmap()将Bitmap对象保存为文件。
四、释放Bitmap对象和指针在使用完Bitmap对象和指针后,需要释放它们以避免内存泄漏。
图形设备接口DirectX 图形接口指南
图形设备接口:DirectX 图形接口指南疯狂代码 / ĵ:http://GameDevelopment/Article35957.html译者申明:这些指南是我在阅读 DirectX8.1 SDK 中逐步翻译出来对于初次接触 DirectX Graphics 编程者而言这应该是很好上手资料其实本人就是从这些指南开始深入 Direct3D8.1 ;由于这是本人第次翻译英文材料言语不通词不达意的处定很多些术语也译得很勉强请见谅此外需要转载此文者请保留以下部分:-----------------------------------------------------------------------DirectX图形接口指南 译者:In355Hz 电子邮箱: In355Hz@-----------------------------------------------------------------------DirectX 图形接口指南:(应用于 DirectX 8.1 版 C/C 编程)本区域指南将介绍说明如何在 C/C 中使用 Microsoft Direct3D 和 Direct3DX 完成些普通工作这些工作总是被分解成若干个必要步骤在某些情况下为了使表达更清楚些步骤还被细分成几个子步骤本区域提供指南有:· 指南:创建设备· 指南 2:演示顶点· 指南 3:使用矩阵· 指南 4:创建和使用光源· 指南 5:使用纹理映射· 指南 6:使用Mesh模型提示:指南中出现举例代码来自于每个指南具体提供路径里源文件这些指南中源代码是用 C 写成如果使用C编译器你必须适当改变这些文件使它们能够编译通过最少你需要加入vtable 然后用它引用接口包含在举例代码中些注解可能和来自 Microsoft Platform Software Development Kit (SDK) 中源代码区别这些改变仅仅为了简化表述并且只限于注解中这样能够防止举例行为被改变指南:创建设备为了使用 Microsoft Direct3D你首先需要创建个应用窗口并紧接着创建和化 Direct3D 对象你应该使用这些对象提供 COM 接口来操纵它们以及创建描绘个场景所必需其它对象本指南包含 CreateDevice 举例将例示并介绍说明以下几个工作:创建 Direct3D 设备并且绘制个简单蓝色屏幕这个指南使用以下步骤:化 Direct3D绘制场景以及最后清理和关闭·步骤:创建个窗口·步骤 2:化 Direct3D·步骤 3:处理系统消息·步骤 4:绘制和显示场景·步骤 5:关闭和清除注意:CreateDevice 举例路径在:(SDK root)\\Samples\\Multimedia\\Direct3D\\Tutorials\\Tut01_CreateDevice.步骤:创建个窗口任何 Microsoft Windows 执行中必须要作第件事就是创建个应用窗口并将其显示给用户为做到这点CreateDevice 例程将首先实现它 WinMain 以下举例代码完成了窗口化INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT ){// Register the window .WNDCLASSEX wc = { (WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,GetModuleHandle(NULL), NULL, NULL, NULL, NULL,"D3D Tutorial", NULL };RegisterClassEx( &wc );// Create the application's window.HWND hWnd = CreateWindow( "D3D Tutorial", "D3D Tutorial 01: CreateDevice",WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,GetDesktopWindow, NULL, wc.hInstance, NULL );前述举例代码是标准 Windows 编程例子开始时定义和注册了个窗口类名为 "D3D Tutorial"类注册以后举例代码使用已注册类创建了个基本顶层(top-level)窗口客户区域为 300 像素宽300 像数高这个窗口没有菜单或子窗口举例使用了 WS_OVERLAPPEDWINDOW 属性创建个包括最大化最小化以及关闭按钮普通窗口(如果该例程将运行在全屏模式下首选窗口属性应该是WS_EX_TOPMOST它指定创建窗口置于并且保持在所有非最高(non-topmost)窗口的前甚至在窗口失活情况下)旦窗口创建完成例代码标准 Microsoft Win32 显示和更新窗口在应用窗口准备好以后你就能开始设置具体 Microsoft Direct3D 对象了请见:步骤 2:化 Direct3D步骤 2:化 Direct3DCreateDevice 举例在 WinMain 中创建窗口的后该定义 InitD3D 完成 Microsoft Direct3D 化过程在创建窗口的后已经准备好化你将用来绘制场景 Direct3D 对象了这个过程包括创建个 Direct3D 对象设置Present Parameters以及最后创建 Direct3D 设备创建完 Direct3D 对象的后你可以立即使用 IDirect3D8::CreateDevice 思路方法创建 Direct3D 设备你也能够使用 Direct3D 对象枚举设备类型模式以及其他东西这些工作代码段应位于使用 Direct3DCreate8 创建Direct3D 对象的后( NULL ( g_pD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) )E_FAIL;传递给 Direct3DCreate8 唯参数应该始终是 D3D_SDK_VERSION它告诉 Direct3D 当前使用头文件信息无论如何头文件或者其他变化将导致这个值增加并强制使用该值应用重新编译如果此版本不匹配 Direct3DCreate8将失败下个步骤是使用 IDirect3D8::GetAdapterDisplayMode 接口找到当前显示模式代码如下:D3DDISPLAYMODE d3ddm;( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )E_FAIL;D3DDISPLAYMODE 结构中 Format 变量将被用于创建 Direct3D 设备如果是运行于窗口模式下话Format 参数通常用来创建个和适配器当前模式相匹配后背缓冲 (Back buffer)在给 D3DPRESENT_PARAMETERS 各参数赋值时你必须指定你应用在3D下工作方式本 CreateDevice 例程设置D3DPRESENT_PARAMETERS结构中 Windowed 为 TRUESwapEffect 为D3DSWAPEFFECT_DISCARDBackBufferFormat 为 d3ddm.FormatD3DPRESENT_PARAMETERS d3dpp;ZeroMemory( &d3dpp, (d3dpp) );d3dpp.Windowed = TRUE;d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;d3dpp.BackBufferFormat = d3ddm.Format;最后步是利用 IDirect3D8::CreateDevice 创建 Direct3D 设备代码如下:( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp, &g_pd3dDevice ) ) )前述代码使用 D3DADAPTER_DEFAULT 标志创建了个使用省缺适配器设备在非常多数情况下系统只有个适配器除非它安装了多个图形加速卡通过把 DeviceType 参数设成 D3DDEVTYPE_HAL表示你希望获得个实际硬件设备 (hardware device) 而不是软件Software虚拟设备 (software device)举例代码还使用D3DCREATE_SOFTWARE_VERTEXPROCESSING 标志通知系统使用软件Software顶点处理 (software vertex processing)注意如果你指定 D3DCREATE_HARDWARE_VERTEXPROCESSING 标志通知系统使用硬件顶点处理 (hardware vertex processing),你可以在支持硬件顶点处理图形加速卡上得到大幅度性能提升现在 Direct3D 已经化完毕下步是确保你具有个机制用来来处理系统消息见下文:步骤 3:处理系统消息步骤 3:处理系统消息完成创建窗口以及化 Direct3D 以后你已经准备好绘制场景 (Render scene)大多数情况下Microsoft Windows 在它们消息循环里监视系统消息并且在队列里没有消息时绘制画面帧然而CreateDevice 例程仅仅在等到个WM_PAINT出现在队列里时才通知应用重绘窗口所有部分// The message loop.MSG msg;while( GetMessage( &msg, NULL, 0, 0 ) ){TranslateMessage( &msg );DispatchMessage( &msg );}当每循环次DispatchMessage MsgProc后者负责处理队列里消息当 WM_PAINT 消息进队时该自身定义Render它将负责重绘窗口然后 Microsoft Win32 ValidateRect 执行并将整个客户区域设为有效消息处理例代码如下:LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) {switch( msg ){WM_DESTROY:PostQuitMessage( 0 );0;WM_PAINT:Render;ValidateRect( hWnd, NULL );0;}DefWindowProc( hWnd, msg, wParam, lParam );}现在应用处理了系统消息接着步是绘制显示见:步骤 4:绘制和显示场景步骤 4:绘制和显示场景为了描绘和显示需要场景本例程在这步把后背缓冲 (back buffer) 填充为蓝色然后将此后背缓冲内容传给前景缓冲 (front buffer), 并且将前景缓冲提交至屏幕清除表面应 IDirect3DDevice8::Clear :// Clear the back buffer to a blue colorg_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );Clear 接受前两个参数通知 Microsoft Direct3D 被清除矩形区域基址和大小该矩形区域描述了绘制目标表面(render target surface) 里需要清除区域在大多数情况下只使用单个矩形覆盖整个绘制目标表面这样你只需设置第个参数为 0 及第 2个参数为 NULL第3个参数将决定思路方法行为你可以通过设置特定标志用来清除绘制目标表面 (render target surface)关联Z缓冲 (associated depth buffer)模版缓冲 (stencil buffer)以及任意这 3者混合本指南不使用Z缓冲所以仅仅使用了 D3DCLEAR_TARGET 标志最后 3个参数分别用于设置对应绘制目标表面、Z缓冲和模版缓冲清除填充值(reflect clearing values)该 CreateDevice 例程将绘制目表面清除填充色设置为蓝色(D3DCOLOR_XRGB(0,0,255)由于相应标志没有设置最后两个参数被 Clear 忽略在清除了视口 (viewport) 的后CreateDevice 例程告知 Direct3D 绘图将要开始然后立即通知这次绘制完成见以下代码段:// Begin the scene.g_pd3dDevice->BeginScene;// Rendering of scene objects happens here.// End the scene.g_pd3dDevice->EndScene;当绘制开始或完成时IDirect3DDevice8::BeginScene 和 IDirect3DDevice8::EndScene 将用信号通知系统你只能在这两的间其它绘图即使绘图失败你也应该在重新 BeginScene 的前 EndScene绘制完的后 IDirect3DDevice8::Present显示该场景:g_pd3dDevice->Present( NULL, NULL, NULL, NULL );Present 接受前两个参数是原始矩形和目标矩形在这步例程设置这两个参数为 NULL 并把整个后备缓冲提交到前景缓冲第 3个参数用于设置该次提交目标窗口这个参数被设为 NULL实际使用窗口是D3DPRESENT_PARAMETERS hWndDeviceWindow 成员第 4个是 DirtyRegion 参数在绝大多数情况下应该设为 NULL本指南最终步骤是关闭应用见:步骤 5:关闭和清除步骤 5:关闭和清除在执行若干时刻你应用必须立即关闭关闭个 Direct3D 应用中不只是意味着你必须销毁窗口并且你还要释放中使用过任何 Direct3D 对象并且无效化它们指针当收到个 WM_DESTROY 消息时CreateDevice 例程通过个本地定义 Cleanup 来处理这些工作VOID Cleanup{( g_pd3dDevice != NULL)g_pd3dDevice->Release;( g_pD3D != NULL)g_pD3D->Release;}上述对每个对象 IUnknown::Release 思路方法来释放它们自身由于DirectX遵循 COM 规则大多数对象当其引用计数降为0时DirectX会自动从内存中释放这个对象对于其他关闭情况可能发生在平常执行中——比如用户改变了桌面参数或色深——此时你可能需要撤销和重建使用中 Microsoft Direct3D 对象因此个好主意就是将你释放代码放到起以便能在需要时随时它本指南已经介绍说明了如何创建个设备指南 2:演示顶点(Render Vertex) 将告诉你如何用顶点(Vertex)创建几何形体指南 2:演示顶点(Render Vertex)Microsoft Direct3D 写应用使用顶点(Vertex)构造几何物体每个 3维空间 (3D) 场景包括个或几个这样几何物体Vertices 例程构造简单物体个 3角形并且将它绘制到显示屏上本指南介绍说明如何采用以下步骤从顶点构造个 3角形:·第步:定义个自定义顶点类型·第 2步:设置顶点缓冲·第 3步:绘制至显示屏注意:Vertices 举例路径为:(SDK root)\\Samples\\Multimedia\\Direct3D\\Tutorials\\Tut02_Vertices.Vertices 举例代码和 CreateDevice 代码大部分相同本“演示顶点(Render Vertex)”指南仅仅关注于那些独特有关顶点代码而不包括化 Direct3D处理 Microsoft Windows 消息绘图和清理等工作如要得到有关这些任务信息请参考 指南:创建设备第步:定义个自定义顶点类型Vertices 例程使用 3个顶点构造个 2D 3角形这里提及了顶点缓冲概念这是用于保存和演示大量顶点 Microsoft Direct3D 对象通过指定个自定义顶点结构和相应可变向量格式 (FVF)顶点能够采用很多思路方法定义本Vertices 例程使用顶点格式定义于以下代码片断中struct CUSTOMVERTEX{FLOAT x, y, z, rhw; // The transformed position for the vertex.DWORD color; // The vertex color.};上面结构体介绍说明了自定义顶点类型格式下步是定义 FVF 以描述顶点缓冲区中顶点内容以下代码片段定义了个 FVF 并符合此上建立自定义顶点类型# D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)可变顶点格式标记描述了使用中自定义顶点类型前述举例代码使用了 D3DFVF_XYZRHW 和D3DFVF_DIFFUSE 标志这将告诉顶点缓冲自定义顶点类型包含组转换过点坐标并紧跟着个颜色参数现在自定义向量格式和 FVF 已经被指定好了下步将使用顶点填充顶点缓冲区请参看:第 2步:设置顶点缓冲注意:Vertices 例程中顶点是转换过用另句话说它们已经在 2D 窗口坐标系下这意味着座标点 (0,0) 位于左上角且正 x 半轴向右正 y 半轴向下这些顶点同样也是光照过这介绍说明它们着色不通过 Direct3D 照明而由它们自己颜色代替第 2步:设置顶点缓冲现在自定义顶点格式已经完成化顶点时候到了 Vertices 例程创建了必需 Microsoft Direct3D 对象的后本内部定义 InitVB 进行这个工作以下代码段将化 3个自定义顶点值CUSTOMVERTEX g_Vertices ={{ 150.0f, 50.0f, 0.5f, 1.0f, 0xffff0000, }, // x, y, z, rhw, color{ 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, },{ 50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, },};前述代码片段采用 3角形 3个顶点填充 3个Vertex并指定了每个顶点散射光颜色第个顶点位于 (150,50) 散射红色 (0xffff0000)第 2个顶点位于 (250,250) 为绿色 (0xff00ff00)第 3点位于 (50,250) 并散射蓝绿色(0xff00ffff)每点都具有相同 0.5 Z值及 1.0 RHW 参数有关这些矢量格式其它信息见 SDK: Transformed and Lit Vertices下步将 IDirect3DDevice8::CreateVertexBuffer 创建顶点缓冲区如以下代码段所示:( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*(CUSTOMVERTEX),0 /* Usage */, D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT, &g_pVB ) ) )E_FAIL;CreateVertexBuffer 头两个参数告诉 Direct3D 新顶点缓冲区预计大小和使用方法紧跟两个参数指定新缓冲区矢量格式及存储位置这里向量格式是 D3DFVF_CUSTOMVERTEX就是例程先前定义 FVF 值D3DPOOL_DEFAULT 标记告诉 Direct3D 在最合适位置创建此顶点缓冲区最后个参数返回创建完成顶点缓冲区对象地址创建了顶点缓冲区的后如以下代码段所示开始采用自定义格式顶点填充缓冲区中数据VOID* pVertices;( FAILED( g_pVB->Lock( 0, (g_Vertices), (BYTE**)&pVertices, 0 ) ) )E_FAIL;memcpy( pVertices, g_Vertices, (g_Vertices) );g_pVB->Unlock;首先 IDirect3DVertexBuffer8::Lock 锁定顶点缓冲区第个参数是锁定顶点数据偏移量按字节计算第 2个参数是需锁定顶点数据长度同样按字节计算第 3个参数是个 BYTE 类型指针地址用于返回指向顶点数据地址第 4个参数告知顶点缓冲区如何锁定数据通过使用 memcpy顶点被复制到顶点缓冲区里将顶点放入缓冲区的后次 IDirect3DVertexBuffer8::Unlock 以解锁顶点缓冲区这个锁定——解锁机制是必需正在使用顶点缓冲区可能位于设备内存中现在顶点缓冲区已经填入顶点绘制到显示时候到了见描述:第 3步:绘制至显示屏第 3步:绘制至显示屏现在缓冲区已经填入顶点现在需要把它绘制到显示屏上在绘制到屏幕的前先将背景清除为蓝色并 BeginSceneg_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0L );g_pd3dDevice->BeginScene;从顶点缓冲区绘制顶点数据需要些步骤首先你需要设置流数据源;在当前情况下使用第 0 个流 流数据源是通过IDirect3DDevice8::SetStreamSource 设置g_pd3dDevice->SetStreamSource( 0, g_pVB, (CUSTOMVERTEX) );SetStreamSource 第个参数告诉 Microsoft Direct3D 设备设置数据流索引第 2个参数是绑定在该数据流上顶点缓冲区第 3个参数是数据单元大小用字节数表示在上面举例代码中将使用CUSTOMVERTEX 大小作为数据单元大小下步通过 IDirect3DDevice8::SetVertexShader 使 Direct3D 了解使用中顶点处理器(Vertex Shader)就整体而言自定义顶点处理器是种高级话题但是在绝大多数情况下顶点处理器仅仅等于 FVF 代码这能够让 Direct3D 知道处理中顶点类型以下代码片段将FVF设置为当前顶点处理器:g_pd3dDevice->SetVertexShader( D3DFVF_CUSTOMVERTEX );SetVertexShader 唯参数是当前设置顶点处理器句柄这个参数值可以是从IDirect3DDevice8::CreateVertexShader 返回句柄或者是 FVF 代码在这儿使用参数是定义为D3DFVF_CUSTOMVERTEX FVF 代码有关顶点处理器更多信息请见 SDK: Vertex Shader 章下步使用 IDirect3DDevice8::DrawPrimitive 绘制顶点缓冲区中顶点见以下代码片段:g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );DrawPrimitive 接受第个参数是个标记它通知 Direct3D 绘制哪种类型物件(Primitive)本例程使用D3DPT_TRIANGLELIST 标记指定为 3角形序列第 2个参数是第个顶点索引第 3个参数通知绘制物件数目本例子只画个 3角形这个值为 1有关区别种类物件更多信息可见 SDK: 3-D Primitive最后步是结束场景并立即将后背缓冲提交为前景缓冲这些写在以下代码片段中:g_pd3dDevice->EndScene;g_pd3dDevice->Present( NULL, NULL, NULL, NULL );当后背缓冲被提交为前景缓冲后客户窗口将显示出个 3个点颜色各异 3角形本指南已经指导你如何使用顶点构造几何外形了指南 3:使用矩阵 将介绍矩阵概念以及如何使用它们指南 3:使用矩阵本指南介绍矩阵概念及演示如何使用它们Vertices 例程通过呈递2D顶点画出了个 3角形然而在这个指南中你将通过顶点变换在 3-D 环境下工作矩阵和变换也同样用于设置摄影头和视口(Viewport)在 Matrices 例程呈递几何物体的前它自定义 SetupMatrices 创建并设置用于演示 3-D 3角形矩阵变换作为代表 3种类型变换同时被设置到个 3-D 场景创建这些典型变换步骤如下表:·第步:定义世界变换矩阵·第 2步:定义观察变换矩阵·第 3步:定义映射变换矩阵注意:Matrices 举例路径为:(SDK root)\\Samples\\Multimedia\\Direct3D\\Tutorials\\Tut03_Matrices.创建这 3种变换顺序并不影响场景元素输出无论如何Direct3D 都使用以下顺序依次将矩阵作用于场景:(1) 世界(2) 观察(3) 映射Matrices 工程举例代码几乎和 Vertices 工程代码相同该“使用矩阵”指南仅仅关注那些有关矩阵独特代码而不重复化 Direct3D处理 Microsoft Windows 消息演示以及清除有关这些工作信息请见 指南:创建设备本指南使用自定义顶点格式和单个顶点缓冲区呈递几何模型有关更多有关选择自定义顶点类型以及执行顶点缓冲区信息见 指南 2:演示顶点第步:定义世界变换矩阵(World Transformation Matrix)世界变换矩阵定义了怎样转换、缩放、以及旋转 3-D 模拟空间中几何物体以下代码片段为 Microsoft Direct3D 设备设置当前世界变换并且使 3角形绕 y-轴 旋转D3DXMATRIX matWorld;D3DXMatrixRotationY( &matWorld, timeGetTime/150.0f );g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );第步是通过 D3DXMatrixRotationY 使 3角形绕 y-轴 旋转第个参数是指向 D3DMATRIX 结构指针用于返回操作结果第 2个参数是以弧度表示旋转角度下步是 IDirect3DDevice8::SetTransform 给 Direct3D 设备设置世界变换SetTransform 接受第个参数通知Direct3D 被设置是哪个转换这个例子用 D3DTS_WORLD 宏指定被设置是世界变换第 2个参数是个指向被设为当前变换的矩阵指针有关世界变换更多信息见:SDK: World Transformation定义完场景世界变换后你可以准备观察变换矩阵了再次请注意:定义任变换顺序不是关键无论如何Direct3D 采用以下顺序将这些矩阵作用于场景:(1) 世界(2) 观察(3) 映射定义观察变换矩阵请参看 第 2步:定义观察变换矩阵第 2步:定义观察变换矩阵(View Transformation Matrix)观察变换矩阵定义了观察位置和旋转角度此观察矩阵就相当于场景摄影机以下代码片段创建了个观察变换矩阵并将其设置为 Microsoft Direct3D 设备当前观察矩阵D3DXMATRIX matView;D3DXMatrixLookAtLH( &matView, &D3DXVECTOR3( 0.0f, 3.0f,-5.0f ),&D3DXVECTOR3( 0.0f, 0.0f, 0.0f ),&D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) );g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );第步是通过 D3DXMatrixLookAtLH 定义观察矩阵第个参数是个指向 D3DXMATRIX 结构指针用来接受操作结果第 2、 3、 4个参数定义了观察点、注视点、以及方向“上”这儿设置观察点为沿 Z-轴 反方向 5 单位再往上3 单位注视点为原点以及作为“上”方向为 Y-轴下步是 IDirect3DDevice8::SetTransform 给 Direct3D 设备设置观察矩阵SetTransform 接受第个参数通知Direct3D 哪个变换将要被设置该例程使用 D3DTS_VIEW 标记指定为观察矩阵第 2个参数是个指向矩阵指针它被设为当前变换有关观察矩阵更多信息见:SDK: View Transformation定义了场景世界变换后你可以开始准备映射变换矩阵了再次提醒定义每变换顺序不是关键性无论如何Direct3D 总是采用以下顺序将矩阵应用于场景:(1) 世界(2) 观察(3) 映射定义映射变换矩阵工作被描述在 第 3步:定义映射变换矩阵第 3步:定义映射变换矩阵(Projection Transformation Matrix)映射变换矩阵定义了将 3-D 观察空间转换为 2-D 视口空间几何学思路方法以下代码片段创建映射变换矩阵并将其设为 Microsoft Direct3D 设备当前映射变换D3DXMATRIX matProj;D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );第步是 D3DXMatrixPerspectiveFovLH 设置映射矩阵第个参数是个指向 D3DXMATRIX 结构用于接受操作结果第 2个参数定义视场它介绍说明物体如何随着距离而缩小个典型视场是 1/4 π就像这个例子使用样第 3个参数定义了屏幕纵横比本举例采用典型纵横比 1第 4和第 5个参数定义最近和最远剪切平面这是用于确定位于何种距离的外几何物体无需再绘制本 Matrices 举例设置它最近剪切平面为 1最远剪切平面为 100下步是 IDirect3DDevice8::SetTransfrom 对 Direct3D 应用变换SetTransfrom 接受第个参数通知 Direct3D 何种变换被设置本例程使用 D3DTS_PROJECTION 标志指定映射变换将被设置第 2个参数是个指向矩阵指针它将被设置为当前变换有关映射变换更多信息参见:“映射变换”本指南已经提示你如何使用矩阵指南 4:创建和使用光源 将揭示如何在你场景中添加光源以增加真实性指南 4:创建和使用光源Microsoft Direc3D 光照系统给 3-D 物体提供更多真实性当使用它时每个场景中几何对象将被照亮基于它们位置和使用光源类型这个指南例程将介绍有关光照和材质主题本指南包含以下步骤用于创建材质和光照:·第步:创始化场景几何·第 2步:设置材置和光照注意:Lights 举例路径为:(SDK root)\\Samples\\Multimedia\\Direct3D\\Tutorials\\Tut04_Lights.注意:Lights 例程中代码和 Matrices 例程代码几乎完全样“创建和使用光源”指南仅仅关注于有关创建和使用光照独特代码而并不重复有关设置 Direct3D处理 Microsoft Windows 消息绘制或者清理内容有关这些任务其他信息见:指南:创建设备本指南使用自定义顶点和顶点缓冲区呈递几何形体有关选择个自定义顶点格式并执行顶点缓冲更多信息见:指南2:演示顶点本指南采用矩阵变换几何对象有关矩阵和变换更多信息参见:指南 3:使用矩阵第步:创始化场景几何使用光照个前提是每个表面都应该有法向量为此Lights 例程使用个稍微区别自定义顶点格式新自定义顶点格式具有个 3-D 位置坐标和个表面法向量这个表面法向量被用于 Microsoft Direct3D 光照计算核心struct CUSTOMVERTEX{D3DXVECTOR3 position; // The 3-D position for the vertex.D3DXVECTOR3 normal; // The surface normal for the vertex.};// Custom FVF.# D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)现在适当矢量格式定义好了Lights 例程 InitGeometry个自定义以创建个圆柱体最初步骤是创建个顶点缓冲区并用它保存这个圆柱体各点如以下例代码所示:// Create the vertex buffer.( FAILED( g_pd3dDevice->CreateVertexBuffer( 50*2*(CUSTOMVERTEX),0 /* Usage */, D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT, &g_pVB ) ) )E_FAIL;下步是使用圆柱体顶点填充顶点缓冲区注意下面举例代码每个点都被定义了个位置和个法向量for( DWORD i=0; i<50; i ){FLOAT theta = (2*D3DX_PI*i)/(50-1);pVertices[2*i+0].position = D3DXVECTOR3( sinf(theta),-1.0f, cosf(theta) );pVertices[2*i+0].normal = D3DXVECTOR3( sinf(theta), 0.0f, cosf(theta) );pVertices[2*i+1].position = D3DXVECTOR3( sinf(theta), 1.0f, cosf(theta) );pVertices[2*i+1].normal = D3DXVECTOR3( sinf(theta), 0.0f, cosf(theta) );}在前述例程使用圆柱体顶点填充了顶点缓冲区的后这个顶点缓冲区已经准备好用于呈递了但是首先这个场景材质和光照必须在绘制圆柱体的前被设置这些描述在 第 2步:设置材质和光照第 2步:设置材质和光照为了在 Microsoft Direct3D 中使用光照你必须创建个或多个光源为了确定个几何物体放射何种颜色光线材质必须被创建于绘制几何对象在绘制这个场景的前Lights 例程 SetupLights个自定义来设置材质和个方向性光源创建种材质材质被定义为当束光照到几何物体表面后反射出颜色以下代码片段使用 D3DMATERIAL8 结构来创建个黄色材质D3DMATERIAL8 mtrl;ZeroMemory( &mtrl, (D3DMATERIAL8) );mtrl.Dfuse.r = mtrl.Ambient.r = 1.0f;mtrl.Dfuse.g = mtrl.Ambient.g = 1.0f;mtrl.Dfuse.b = mtrl.Ambient.b = 0.0f;mtrl.Dfuse.a = mtrl.Ambient.a = 1.0f;g_pd3dDevice->SetMaterial( &mtrl );这个材质漫射光颜色和环境光颜色都被设为黄色对 IDirect3DDevice8::SetMaterial 将应用此材质到用于绘制场景 Microsoft Direct3D 设备SetMaterial 接受唯参数是设置材质指针在这个完成以后每个物件都将使用这个材质绘制直到另次对 SetMaterial 指定了个区别材质为止现在材质已经被应用到场景下个步骤是创建光源创建个光源Microsoft Direct3D 里有 3种可用光源:点光源方向形光源和聚光灯光源本举例代码创建个方向形光源它向个方向发光并且不停变换发光方向下列代码片段使用 D3DLIGHT8 结构创建个方向性光源D3DXVECTOR3 vecDir;D3DLIGHT8 light;ZeroMemory( &light, (D3DLIGHT8) );light.Type = D3DLIGHT_DIRECTIONAL;下列代码片设置光源漫射光为白色light.Dfuse.r = 1.0f;light.Dfuse.g = 1.0f;light.Dfuse.b = 1.0f;以下代码片在个环内旋转光源方向vecDir = D3DXVECTOR3(cosf(timeGetTime/360.0f),0.0f,sinf(timeGetTime/360.0f) );D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );对 D3DXVec3Normalize 将归化方向矢量并化光源方向可以设置个范围告诉 Direct3D 此光源能影响多远距离这个成员参数对方向性光源无效以下代码片指定此光源范围为 1000 单位light.Range = 1000.0f;下面代码片将这个光源分配到当前 Direct3D 设备通过 IDirect3DDevice8::SetLightg_pd3dDevice->SetLight( 0, &light );SetLight 接受第个参数是此光源被分配索引号注意如果在此索引已存在个光源它将被新光源覆盖第 2个参数是个指向新定义光源数据结构指针本 Lights 例程设置这个光源位于 0 号索引下列代码片激活这个光源通过 IDirect3DDevice8::LightEnableg_pd3dDevice->LightEnable( 0, TRUE);LightEnable 接受第个参数是激活光源索引第 2个参数是个布尔量通知此光源是开 (TRUE) 还是闭 (FALSE)在上面例程中索引 0 上光源被打开以下代码片通知 Direct3D 呈递此光源通过 IDirect3DDevice8::SetRenderStateg_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );SetRenderState 接受头两个参数是哪个设备状态变量被改写以及写入何种值本例程设置 D3DRS_LIGHTING 设备变量为 TRUE这将使设备能够演示光照效果本例程最后步是通过再次 SetRenderState 打开环境照明光g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0x00202020 );当前代码段设置 D3DRS_AMBIENT 设备变量为种浅灰色 (0x00202020)环境照明将使用所给颜色照亮所有物体有关照明及材质更多信息参见 SDK: Lights and Materials本例程向你介绍说明了如何使用照明和材质指南 5:使用纹理映射 将向你介绍说明如何将纹理添加到物体表面上指南 5:使用纹理映射尽管光照和材质大大增加了场景真实感但没有比在表面上添加纹理更能增加真实感了纹理能够被想象为层紧紧包装在表面贴纸你能在个立方体上放置层木质纹理使它看起来就象用木头制成样本 Texture 例程将在 指南 4:创建和使用光照 中构造圆柱上添加幅类似香蕉纹理此指南介绍内容包括如何载入纹理设置纹理和呈递带有纹理物体本指南采用以下步骤实现纹理:·第步:定义个定制顶点格式·第 2步:化屏幕几何·第 3步:演示场景。
第06课 - 图形设备接口
消 息 队 列
线程
17
return 0; }
鼠标消息
Windows程序设计-基础教程
鼠标的消息有哪些?
WM_LBUTTONDOWN WM_LBUTTONUP WM_LBUTTONDBLCLK WM_RBUTTONDOWN WM_RBUTTONUP WM_RBUTTONDBLCLK WM_MBUTTONDOWN WM_MOUSEMOVE WM_MOUSEWHEEL WM_NCLBUTTONDOWN WM_NCLBUTTONUP
18
鼠标消息
Windows程序设计-基础教程
WM_LBUTTONDOWN 参数功能:
wParam 存放一个标志,该标志注明了当鼠标左键按 下的时候还有什么键同时被按下。 lParam 存放当前光标的在窗口中的位置。
19
鼠标消息
Windows程序设计-基础教程
光标的位置:
xPos = LOWORD(lParam); yPos = HIWORD(lParam);
34
Windows程序设计-基础教程
绘制直线
பைடு நூலகம்
35
画线函数
Windows程序设计-基础教程
BOOL MoveToEx( HDC hdc, int X, //起始xpos int Y, //起始ypos LPPOINT lpPoint //光标的旧位置 ); 功能:确定直线的起始坐标 BOOL LineTo( HDC hdc, int nXEnd, int nYEnd); 功能:确定直线的结束坐标,并画线
27
设备环境句柄
Windows程序设计-基础教程
HDC 设备环境句柄
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
删除连接到CGdiObject
删除任何由FromHandle所创建的临时 CGDIObject对象
使Windows GDI对象与CGDIObject对象 断开连接,并返回Windows GDI对象的 句柄
除非this为NULL时该成员函数返回
3.3 画笔与画刷
使用CImage显示图片
(1)在项目中的stdafx.h文件加入
#include <atlimage.h>
(2)视图类 CImage m_imgBody;
(3)CA09View::CA09View() {
m_imgBody.Load("vc.bmp"); }
(4)void CA09View::OnDraw(CDC* pDC)
Visual C++程序设计
杨琦 计算机教学实验中心
西安交通大学
授课内容
3.1 图形设备接口的基本概念 3.2 绘图工具类 3.3 画笔与画刷 3.4 位图 3.5 字体 3.6 绘图模式 3.7 库存图形对象 3.8 典型案例
3.1 设备环境类和图形对象
图形设备接口GDI (Graphics Device Interface,GDI)
CPen类
CPen类
void CMyView::OnDraw(CDC* pDC) { CPen penMountain,*pOldpen; penMountain.CreatePen(PS_SOLID,3,RGB(125, 50, 0)); pOldpen=pDC->SelectObject(&penMountain); CPoint m_pointMountain[5]; m_pointMountain[0] = CPoint(100, 200); m_pointMountain[1] = CPoint(200, 100); m_pointMountain[2] = CPoint(300, 150); m_pointMountain[3] = CPoint(400, 50); m_pointMountain[4] = CPoint(600, 200); pDC->Polyline(m_pointMountain, 5); pDC->MoveTo(0,200); pDC->LineTo(700,200); pDC->SelectObject(pOldpen);
从左下角到右上角的45度斜线/////
水平线与垂直线+++++ 相互垂直的45度线XXXXX
HS_FDIAGONAL 45度向下\\\\\\
HS_HORIZONTAL HS_VERTICAL
水平线----垂直线|||||
效果图:
【例3-1】 绘制蓝天、草地和大山
void CMyView::OnDraw(CDC* pDC) { CBrush *pOldBrush, brushSky, brushGrass, brushMoutain; CRect rect; GetClientRect(&rect); brushSky.CreateSolidBrush(RGB(127, 200, 255)); // 画天空 pOldBrush = pDC->SelectObject(&brushSky); pDC->Rectangle(rect); brushGrass.CreateSolidBrush(RGB(0, 255, 0)); // 画草地 pDC->SelectObject(&brushGrass); rect.top = 300; pDC->Rectangle(rect);
设备环境类:CPaintDC 、CWindowDC 等
3.2 绘图工具类
CGdiObject类的常用成员函数
函数 Attach CreateStockObject DeleteObject DeleteTempMap Detach
GetSafeHandle
含义
链接一个Windows GDI对象到一个 CPen:: CreatePen (int nPenStyle, int nWidth, COLORREF crColor);
第1个参数是画笔样式,可取
PS_SOLID
创建实线笔
PS_DASH
创建由短线构成的虚线
PS_DOT
创建由点构成的虚线
PS_DASHDOT
创建由短线和点构成的虚线
brushMoutain.CreateSolidBrush(RGB(125, 50, 0)); pDC->SelectObject(&brushMoutain); CPoint m_pointMoutain[5]; m_pointMoutain[0] = CPoint(200, 300); m_pointMoutain[1] = CPoint(300, 200); m_pointMoutain[2] = CPoint(400, 250); m_pointMoutain[3] = CPoint(500, 150); m_pointMoutain[4] = CPoint(700, 300); pDC->Polygon(m_pointMoutain, 5); pDC->SelectObject(pOldBrush); }
PS_DASHDOTDOT 由短线、点、点构成的虚线
PS_NULL
创建空(空白)画笔
CDC::SelectObject函数原型
CPen* SelectObject( CPen* pPen ); CBrush* SelectObject( CBrush* pBrush ); CFont* SelectObject( CFont* pFont );
}
CBrush类
BOOL CreateSolidBrush ( COLORREF crColor ); BOOL CreateHatchBrush ( int nIndex,
COLORREF crColor );
阴影风格 HS_BDIAGONAL HS_CROSS HS_DIAGCROSS
说明