图形设备接口概述
GUI的种类及uCGUI的架构
GUI的种类及uCGUI的架构(说明:本博文转载自他人笔下,希望可以帮助同僚更深刻的认识GUI)GUI的种类及uC/GUI的架构一. GUI概述GUI(Graphic User Interface)是图形化的用户界面,它能提供友好的人机交互接口。
它有以下特性:体积小,运行时耗用系统资源少,层次化的结构,易移植,可靠性高嵌入式GUI种类嵌入式GUI种类有很多,下面列举几种:1. WINCE的GWES(图形、窗口、事件子系统),由应用程序接口(API)、用户接口(UI)和图形设备接口(GDI)组成,包含了消息机制2. Trolltech公司的产品:QT、QTE、QTOPIA,它们跨平台、功能强大,但资源消耗多3.MINIGUI是魏永明创建的嵌入式GUI中间件,可以以多线程、多进程、以及单任务运行,是比较成熟的商用系统4.ucGUI能支持多种环境的GUI,可以以多任务形式运行或者以前后台模式运行。
商用化,但功能相对简单GUI的两种模式:1. Windows模式,采用类似windows的API和相应的消息机制,如ucGUI、MicroWindows、miniGUI2.C/S模式,采用一个XServer,所有的显示都以客户端的形式请求服务,如Nano-XGUI在嵌入式系统或实时系统中的地位越来越多的市场需求数据显示,包括PDA、娱乐消费电子、机顶盒、DVD等影音设备、WAP 手机等高端电子产品得到广泛应用,原先仅在军工、工业控制等领域中使用的GUI图形系统,受到越来越多的关注。
对于轻量级 GUI 的系统而言,对 GUI 的要求相对较低,如传统51类型单片机这类系统一般不希望建立在庞大累赘的、非常消耗系统资源的操作系统和 GUI 之上,如 Windows 或 X Window。
目前此类系统都直接使用原有编程手段,采用比较简单的手法实现GUI。
对于太过庞大和臃肿的GUI系统而言,μc/GUI这类可运用于此类资源较紧张的轻型 GUI 的需求更加突出uc/GUI简介μc/GUI是美国Micrium公司出品的一款针对嵌入式系统的优秀图形软件。
图形设备接口及绘图
§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)是计算机图形学中的一个重要概念, 它提供了一种与图形硬件设备进行交互的抽象层。
图像处理
反走样技术
计算机硬件中的外设接口
计算机硬件中的外设接口计算机硬件中的外设接口是实现计算机与外设设备连接和通信的重要组成部分。
外设接口是指用于连接计算机主机与外部设备之间的接口,它可以传输数据、控制信号和电源等信息,以满足用户对外部设备的输入、输出和控制需求。
在计算机系统中,外设接口起着扩展功能、增强性能和提高用户体验的关键作用。
本文将介绍几种常见的计算机硬件中的外设接口。
1. USB(Universal Serial Bus,通用串行总线)USB是一种通用的外设接口标准。
它被广泛应用于电脑、手机、相机、打印机等各种设备之间的连接。
USB接口具有插拔方便、速度快、支持热插拔和即插即用等特点,使得用户能够方便地连接和使用各种外部设备。
USB接口分为USB-A、USB-B、USB-C等不同类型,各有不同的形状和功能。
2. HDMI(High-Definition Multimedia Interface,高清晰度多媒体接口)HDMI是一种用于高清视频和多通道音频传输的数字接口。
它广泛应用于电视、显示器、投影仪等多媒体设备中。
HDMI接口能够同时传输高清视频和高质量音频信号,支持多种分辨率和音频格式,能够提供更好的影音体验。
3. VGA(Video Graphics Array,视频图形阵列)VGA是一种用于模拟视频信号传输的接口标准。
虽然VGA已逐渐被数字接口所取代,但在一些老旧的计算机或显示设备中仍广泛使用。
VGA接口能够传输模拟RGB视频信号,通常用于连接计算机主机和显示器。
4. DVI(Digital Visual Interface,数字视讯界面)DVI是一种用于数字视频信号传输的接口标准。
它可以连接计算机主机、显示器、投影仪等设备,支持高分辨率的数字视频传输。
DVI接口还可以通过适配器与其他接口标准(如VGA、HDMI)相互转换,提供更广泛的兼容性。
5. Thunderbolt(雷电接口)Thunderbolt是由Intel与苹果公司联合推出的一种高速数据传输接口。
第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)等。
图形设备接口及绘图
✓
绘图函数: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等标准接口已经成为了市场主流,他们相互之间有着一些差异和优势。
接口简介介绍
05 接口的未来趋势
接口技术的创新与发展
01
接口技术的不断发展
随着技术的不断进步,接口技术也在不断创新和发展,包括更快的数据
传输速度、更低的能耗、更高的可靠性和更大的灵活性。
02 03
标准化和开放性
未来接口技术将更加注重标准化和开放性,以实现更广泛的应用和互操 作性。标准化将促进不同厂商的设备之间的兼容性,而开放性则将鼓励 更多的开发者和企业参与接口技术的创新和发展。
接口的分类与组成
分类
接口可以分为硬件接口和软件接口。硬件接口是指不同硬件设备之间的连接,如 USB接口、HDMI接口等;软件接口是指不同软件之间的连接,如API(应用程 序接口)、GUI(图形用户界面)等。
组成
接口由请求和响应组成。请求是指从客户端向服务器发送的请求,例如HTTP请 求;响应是指服务器对客户端请求的响应,例如HTTP响应。
1394接口也称为火线接口,是一种高速串行总线标准,具有传输速度快、支持热插拔等 特点。
HDMI接口
高清多媒体接口,用于连接音视频设备,如电视、音响等。
USB 3.0
相比USB 2.0,USB 3.0的数据传输速度更快,兼容性更好。
现代接口技术
Thunderbolt接口
01
也称为雷电接口,是一种高速串行总线标准,支持数据和视频
接口的协议与标准
协议
接口的协议是指不同设备或软件之间交换信息时所遵循的规 则和标准。常见的协议包括HTTP、TCP/IP、SOAP、REST 等。
标准
接口的标准是指不同厂商或组织所共同制定并遵循的接口规 范。标准的制定有助于实现不同设备或软件之间的互操作性 和信息共享。例如,USB接口标准、HDMI接口标准等。
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()释放设备环境。
用户与操作系统的接口
用户与操作系统的接口在现代计算机技术中,操作系统扮演着至关重要的角色。
它是连接用户和计算机硬件的桥梁,提供了用户与计算机交互的界面。
对于用户来说,操作系统就是他们与计算机硬件沟通的接口。
首先,让我们考虑用户界面的设计。
这是用户与操作系统直接交互的界面,因此,它的设计必须直观,易于理解和使用。
现代的操作系统通常都配备了图形用户界面(GUI),它通过图形和图标提供了一种直观的、可视化的方式让用户进行操作。
此外,为了满足不同用户的需求,一些操作系统还提供了定制化的选项,让用户可以根据自己的喜好和习惯来调整界面的布局和功能。
其次,操作系统的功能也变得越来越丰富和多元化。
除了基本的文件管理和进程控制,现代的操作系统还提供了诸如网络浏览、电子邮件、多媒体播放、游戏等多种功能。
这些功能不仅丰富了用户的使用体验,也使得计算机变得更加普及和实用。
此外,安全性也是操作系统的一个重要考虑因素。
由于操作系统管理着计算机的各个部分,包括内存、硬盘、CPU等,因此它必须能够防止未经授权的访问和攻击。
为此,操作系统通常会配备一系列的安全机制,比如用户验证、访问控制、防火墙等,以确保只有授权的用户可以访问计算机资源。
总的来说,操作系统作为用户与计算机硬件之间的接口,它的设计和功能对用户体验和使用效率有着至关重要的影响。
随着技术的不断发展,我们期待看到更多创新和实用的操作系统出现,为用户带来更加便捷、高效和安全的计算机体验。
操作系统图形用户界面的研究与实现操作系统图形用户界面(GUI)的研究和实现是计算机科学中的重要领域,对于现代操作系统的设计和应用至关重要。
在本文中,我们将探讨图形用户界面的重要性,它的工作原理和实现方法,以及一些具有代表性的操作系统中的GUI的实例。
一、图形用户界面概述图形用户界面是一种计算机界面,使用图像、图标和菜单等元素,允许用户通过点击、拖拽、选择等操作与计算机进行交互。
它大大简化了用户与计算机的交互,提供了直观和高效的使用体验。
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接口作为一种高速的扩展接口,在计算机领域具有广泛的应用前景。
它不仅可以满足大数据传输的需求,还具有独立通道、热插拔、可靠性和稳定性等特点,大大提高了计算机系统的性能和可靠性。
标准vga图形适配器
标准vga图形适配器标准VGA图形适配器。
VGA(Video Graphics Array)是一种显示设备标准,用于连接计算机和显示器,它可以将计算机中的图形和文字信息转换成视频信号,以便在显示器上显示。
VGA图形适配器是计算机中的一种重要设备,它负责将计算机中的图形信息转换成适合显示器显示的信号。
本文将介绍标准VGA图形适配器的工作原理、特点和使用注意事项。
VGA图形适配器的工作原理。
VGA图形适配器通过计算机的显卡将图形信息转换成模拟视频信号,然后通过VGA接口输出到显示器上。
在计算机中,显卡会将图形信息转换成RGB(红、绿、蓝)三种颜色信号,然后通过VGA接口输出到显示器上。
显示器接收到这些信号后,会将其转换成可见的图像,从而实现计算机中图形信息的显示。
VGA图形适配器的特点。
1. 分辨率支持广泛,VGA图形适配器支持的分辨率范围广泛,可以满足不同显示器的显示需求。
2. 兼容性好,VGA图形适配器与大多数显示器兼容,无需额外的驱动程序或设置,即可正常使用。
3. 成本低廉,由于VGA技术已经相对成熟,因此VGA图形适配器的成本相对较低,适合大众用户使用。
4. 易于安装,VGA图形适配器的安装过程简单方便,无需复杂的设置,适合普通用户使用。
VGA图形适配器的使用注意事项。
1. 避免过长的连接线,VGA连接线过长会导致信号衰减,影响显示效果,因此尽量选择合适长度的连接线。
2. 注意接口的连接方向,VGA接口有方向之分,连接时需确保插头和插口方向一致,否则可能无法正常显示。
3. 避免受到外部干扰,VGA连接线容易受到外部干扰,因此在使用时需避免与电源线、信号线等混合布线,以免影响显示效果。
4. 定期清洁连接接口,VGA连接线和接口应定期清洁,以确保良好的信号传输质量。
总结。
VGA图形适配器作为一种重要的计算机外设,广泛应用于各种显示设备中。
它具有分辨率支持广泛、兼容性好、成本低廉、易于安装等特点,使用时需注意避免过长的连接线、连接方向、外部干扰和定期清洁连接接口。
什么是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不支持。
嵌入式系统GUI
7.1 嵌入式系统GUI概述
嵌入式GUI(Graphics User Interface)为嵌入式系统提供了一种应用于特殊场合的人机交互 界面。嵌入式GUI要求简单、直观、可靠、占用资源小且反应快速,以适应系统硬件资源有限 的条件。另外,由于嵌入式系统硬件本身的特殊性,嵌入式GUI应具备高度可移植性与可裁减 性,以适应不同的硬件条件和使用需求。总体来讲,嵌入式GUI具备以下特点: 体积小 运行时耗用系统资源小 上层接口与硬件无关,高度可移植 高可靠性 可配置
指针在它们的对象被破坏的时候变成了“摇摆指针”。
1. QT对象模型 元对象系统 信号和插槽 属性
2. QObject类 对象树 事件处理
3. 窗口部件类
Qt编程核心技术
元对象系统
Qt中的元对象系统是用来处理对象间通信的信号/槽机制、运行时的类型信息和动态属性系统,它 基于QObject类、类声明中的Q_OBJECT宏和元对象编译器moc
signal和slot机制真正实现了封装的概念,slot除了接收signal之外和其它的成员函数没有什么不 同,而且signal和slot之间也不是一一对应的。
Signal和Slot的声明(1/2)
在Qt程序设计中,凡是包含signal和slot的类中都要加上Q_OBJECT的定义
仿真终端 窗口2是一个运 行于主机A上的
仿真终端
窗口3是一个运行 于主机B上的客户 程序的显示输出
主机B
窗口4是一个运行 于局域主机上的客 户程序的显示输出
显示器
键盘
鼠标
带有图形显 示器的主机
7.1 嵌入式系统GUI概述
X窗口系统的分层架构
X标准大致可以划分X Server、Graphic Library(底层绘图函数库)、Toolkits、Window Manager、Internationalization(I18N)等几大部分。
DirectX 与 OpenGL
DirectX与OpenGLDirectX是一种Windows系统的应用程序接口(简称API),它可以让以Windows为作业平台的游戏或多媒体程序获得更高的执行效率,还可以加强3D图形成像和丰富的声音效果,并提供设计人员一个共同的硬件驱动标准。
Microsoft DirectX提供了一套非常好用的应用程序接口,其中包含了设计高性能、实时应用的程序代码,为「DirectX SDK」(俗称「DirectX开发包」)。
此技术能够帮助我们轻易地建构计算机游戏和多媒体的应用程序,其中包括了DirectDraw、DirectSound、DirectPlay、Direct3D和DirectInput等部分的API指令及媒体相关的组件。
这些组件每一个都有特定的用途。
DirectDraw是最为重要的一个,因为所有的图形都要用到它,它是2D图形的引擎,3D图形也同样离不开它。
在Windows操作系统这种保护模式之下,所有图形的接口动作都必须经过GDI这个图形处理中心来处理,而不能直接对硬设备下命令。
图形设备接口(Grahpics?Device?Interface),它是负责在屏幕上显示图形所用的接口。
GDI由百余个函数所组成的。
GDI函数必须通过设备描述表(简称DC)的句柄来控制绘图。
DirectDraw主要的工作是用来帮助Windows的应用程序能够直接进行硬设备的操作,还可以加速显示卡的速度,使得游戏的画面呈现起来更加地流畅。
DirectDraw支持CPU的MMX、3DNow及AGP 等特殊的指令技术,还可以处理多屏幕的显示,让Windows环境下运行的游戏更加地多姿多采。
其它的组件是:DirectSound:提供硬件和软件的声音混合与回放。
DirectMusic:处理基于消息的音乐数据。
它支持乐器数字接口(MIDI)并为创建交互式音乐提供创作工具。
DirectPlay:使得通过调制解调器链接或通过网络来与应用程序相连成为可能。
图形设备接口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)。
MFC设备环境类:
• CDC类既作为其它MFC设备环境类的基类,又可 以作为一个一般的设备环境类使用。利用它可以访 问设备属性和设置绘图属性。CDC类对GDI的所有 绘图函数进行了封装。
• CPaintDC类是OnPaint()函数使用的设备环境类, 它代表一个窗口的绘图画面。如果添加 WM_PAINT消息处理函数OnPaint(),就需要使用 CPaintDC类来定义一个设备环境对象。
• CClientDC类代表了客户区设备环境。当在客户区 实时绘图时,需要利用CClientDC类定义一个客户 区设备环境。
8.1.2 设备环境
• 为了实现设备无关性,应用程序的输出不直接面 向显示器等物理设备,而是面向一个称之为设备 环境DC(Device Context)的虚拟逻辑设备。
• 设备环境也称设备描述表或设备上下文,它是由 Windows管理的一个数据结构,它保存了绘图操 作中一些共同需要设置的信息,如当前的画笔、 画刷、字体和位图等图形对象及其属性,以及颜 色和背景等影响图形输出的绘图模式。
8.1 图形设备接口
• Windows提供了一个称为图形设备接口GDI (Graphics Device Interface)的抽象接口。GDI 作为Windows的重要组成部分,它负责管理用户 绘图操作时功能的转换。用户通过调用GDI函数 与设备打交道,GDI通过不同设备提供的驱动程 序将绘图语句转换为对应的绘图指令,避免了直 接对硬件进行操作,从而实现所谓的设备无关性。
• 形象地说,一个设备环境提供了一张画布和一些 绘画的工具,我们可以使用不同颜色的工具在上 面绘制点、线、圆和文本。
• 设备环境中的“设备”是指任何类型的显示器或 打印机等输出设备,绘图时用户不用关心所使用 设备的编程原理和方法。所有的绘制操作必须通 过设备环境进行间接的处理,Windows自动将设 备环境所描述的结构映射到相应的物理设备上。
映射模式
• 映射模式确定了在绘制图形时所依据的坐标系, 它定义了逻辑单位的实际大小、坐标增长方向, 所有映射模式的坐标原点均在设备输出区域(如 客户区或打印区)的左上角。此外,对于某些映 射模式,用户还可以自定义窗口的长度和宽度, 设置视图区的物理范围。
• Windows定义了8种映射模式:MM_TEXT、 MM_LOMETRIC、MM_HIMETRIC、MM_LOENGLISH、MM_HIENGLISH、MM_TWIPS、MM _ISOTROPIC、MM_ANISOTROPIC
• 从根本上来说,设备环境DC是一个Windows数据 结构,该结构存储着程序向设备输出时所需要的 信息,应用程序利用它定义图形对象及其属性, 并实现应用程序、设备驱动程序和输出设备之间 绘图命令的转换。
• 在Windows中不使用DC无法进行输出,在使用任 何GDI绘图函数之前,必须建立一个设备环境。
Windows鼠标位置使用设备坐标系,以客户区 窗口原点作为基准,而在OnDraw()函数中使用逻辑 坐标。因此,为了在滚动视图中重绘图形,必须在 存储线段起点和终点之前将其坐标转换为逻辑坐标。 实质上,OnDraw()函数由OnPaint()函数调用,在 调用OnDraw()函数前,OnPaint()函数已经调用了 函数OnPrepareDC()对设备环境进行了调整。
• 除了映射模式,窗口和视口也是决定一个点的逻 辑坐标如何转换为设备坐标的一个因素。一个点 的逻辑坐标按照如下式子转换为设备坐标:
设备(视口)坐标 = 逻辑坐标 – 窗口原点坐标 + 视口原点坐标
• 如果采用MFC方法编程,MFC提供了不同类型的 DC类,每一个类都封装了DC句柄,并且它们的构 造函数自动调用获取DC的API函数,析构函数自动 调用释放DC的API函数。因此,在程序中通过声明 一个MFC设备环境类的对象就自动获取了一个DC, 而当该对象被销毁时就自动释放了获取的DC。 MFC AppWizard应用程序向导创建的OnDraw()函 数自动支持所获取的DC。
• CWindowDC类代表了整个程序窗口设备环境,可 以在整个窗口区域绘图。
8.1.3 GDI坐标系和映射模式
• Windows坐标系分为逻辑坐标系和设备坐标系两 种,GDI支持这两种坐标系。一般而言,GDI的文 本和图形输出函数使用逻辑坐标,而在客户区移 动或按下鼠标的鼠标位置是采用设备坐标。
• 映射模式使得程序员可不必考虑输出设备的具体 设备坐标系,而在一个统一的逻辑坐标系中进行 图形的绘制。
Windows映射模式
映射模式 MM_TEXT MM_LOMETRIC MM_HIMETRIC MM_LOEN MM_ISOTROPIC
MM_ANISOTROPIC
• 窗口坐标系以窗口左上角为坐标原点,它包括窗口 标题栏、菜单栏和工具栏等范围。
• 客户区坐标系以窗口客户区左上角为原点,主要用 于客户区的绘图输出和窗口消息的处理。鼠标消息 的坐标参数使用客户区坐标,CDC类绘图成员函数 使用与客户区坐标对应的逻辑坐标。
坐标之间的相互转换
• 编程时,有时需要根据当前的具体情况进行三 种设备坐标之间或与逻辑坐标的相互转换。
// CScrollView::OnLButtonDown(nFlags, point); }
void CMyDrawView::OnMouseMove(UINT nFlags, CPoint point) {
if(m_bDragging) {
CMyDrawDoc *pDoc=GetDocument(); ASSERT_VALID(pDoc); CClientDC dc(this); OnPrepareDC(&dc); dc.DPtoLP(&point); pDoc->AddLine(m_ptOrigin, point); dc.MoveTo(m_ptOrigin); dc.LineTo(point); m_ptOrigin=point; } // CScrollView::OnMouseMove(nFlags, point); }
打开应用程序项目MyDraw,修改单击鼠标和 鼠标移动的消息处理函数。
void CMyDrawView::OnLButtonDown( UINT nFlags, CPoint point)
{ // TODO: Add your message handler code here . . . CClientDC dc(this); OnPrepareDC(&dc); // 调整设备环境的属性 dc.DPtoLP(&point); // 将设备坐标转换为逻辑坐标 SetCapture(); // 捕捉鼠标 ::SetCursor(m_hCross); // 设置十字光标 m_ptOrigin=point; m_bDragging=TRUE; // 设置拖拽标记
第15讲
课 题: 图形处理(1) 目的要求: 让学生了解图形设备接口、画笔和画刷,
掌握基本几何图形的绘制。 教学重点: 设备环境、颜色的设置及GDI对象的使用。 教学难点: 画笔及画刷的使用 教学课时: 2课时 教学方法: 授课为主、鼓励课堂交流 本次课涉及的学术前沿:
Windows是一个图形操作系统,其所有的图 形可视效果都是通过绘制操作而完成的。图形显 示的实质就是利用Windows提供的图形设备接口 将图形绘制在显示器上。大多数应用程序都需要 在客户区绘制一些图形,如绘制文本、几何图形、 位图和光标等。
屏幕坐标系、窗口坐标系和客户区坐标系 • 设备坐标系分为屏幕坐标系、窗口坐标系和客户区
坐标系三种相互独立的坐标系。
• 屏幕坐标系以屏幕左上角为原点,一些与整个屏幕 有关的函数均采用屏幕坐标,如GetCursorPos()、 SetCursorPos()、CreateWindow()、MoveWindow()。 弹出式菜单使用的也是屏幕坐标。
前面几章已经涉及到有关图形处理的内容, 只是使用了Windows系统默认的图形设备接口和 设备环境,绘制的图形没有颜色、线型和字体的 变化。
本章主要学习内容: • 图形处理的基本原理:
– 图形设备接口 – 设备环境 – GDI坐标系 – 映射模式
• 使用画笔和画刷绘制图形 • 文本与字体 • 位图、图标和光标
• MFC提供了两个函数CWnd::ScreenToClient() 和CWnd::ClientToScreen()用于屏幕坐标与客 户区坐标的相互转换。
• MFC提供了两个函数CDC::DPtoLP()和CDC:: LPtoDP()用于设备坐标与逻辑坐标之间的相互 转换。
例 修改例5-13中的程序MyDraw,采用将设备坐标 转换为逻辑坐标的方法实现滚动视图的功能。
设置原点的坐标:
• 通过调用函数CDC::SetWindowOrg()设置设备环 境的窗口原点的坐标,调用 CDC::SetViewportOrg()重新设置设备的视口原点 的坐标。这里,窗口是对应于逻辑坐标系(设备 环境)由用户设定的一个区域,而视口是对应于 实际输出设备由用户设定的一个区域。
• 窗口原点是指逻辑窗口坐标系的原点在视口(设 备)坐标系中的位置,视口原点是指设备实际输 出区域的原点。
• 编程时采用MFC方法绘制图形也很方便,MFC对 GDI函数和绘图对象进行了封装。
8.1.1 概述
• 图形设备接口GDI管理Windows应用程序图形的 绘制,在应用程序中,通过调用GDI函数绘制不 同尺寸、颜色、风格的几何图形、文本和位图。 这些图形处理函数组成了图形设备接口GDI。
• GDI是形成Windows核心的三种动态链接库之一, MFC将GDI函数封装在一个名为CDC的设备环境 类中,因此我们可以通过调用CDC类的成员函数 来完成绘图操作。