论文部分内容阅读
摘要:用DirectDraw技术进行图像显示,速度快不闪烁。文中就DirectDraw的原理作了简要介绍,并给出在嵌入式导航系统中使用DirectDraw进行视频图像显示的实例。
关键词:DirectDraw;blt;DIB;SkinControl
中图分类号:TP317.4文献标识码:A文章编号:1009-3044(2008)24-1192-02
Embedded System Images Display with DirectDraw
HU Bin
(The 38th Institute of China Electronic and Technology Corp, Hefei 230001, China)
Abstract: Displaying computer images with DirectDraw has advantages of fast processing and no flickering. This paper introduces the brief principle of DirectDraw and presents an example using DirectDraw in an embedded system.
Key words: DirectDraw; blt; DIB; SkinControl
1 引言
嵌入式设备图形界面的开发由于硬件条件的限制,对实时性的要求非常突出。如果仍然使用Windows图形设备接口(GDI)来显示图片,将大大限制图形界面的显示速度。
目前比较流行的图形操作方式包括:GDI、OpenGL、DirectDraw三种方式,DirectDraw是DirectX基于COM接口的一个组件,它是DirectX的基石,DirectX的其它组件都是建立在它的基础之上的。DirectDraw允许直接操作显存、硬件位块转移、硬件覆盖和翻面支持。
2 DirectDraw基本要素
DirectDraw通过对显存中位图的直接访问,加速了对硬件和软件图形的实时处理,它提供了一种与设备无关的方法,以获得访问特定的显示设备高级特性的能力。
2.1 设备无关位图
在DirectX中使用设备无关位图(DIB)作为最基本的图形文件格式。DIB本质上是一个描述图像各种信息的文件,包括图像的尺寸、使用的颜色个数及颜色值,还有每个像素的颜色数据等。
2.2 表面(Surface)
在用DirectDraw绘图时,我们首先将图形数据放入创建的缓冲区,再进行转换、拉伸、拷贝等操作,最后显示缓冲区中的图形数据,这些缓冲区就称为表面。表面被分为主表面和离屏表面,主表面是显示内存的一部分,主表面一般情况下是存在两个表面,一个可见的,一个不可见的。不可见的表面被称为后台缓存(Back Buffering),在程序执行页面翻转(Page Flipping)的时候,后台缓存就称为了可见的表面,而原先可见的表面就称为了后台缓存。这样做是为了完成平滑、不闪烁的图像快速切换。
另一种表面称为离屏表面(Off_screen Surface),它始终是不可见的,是用户自定义的一个可变大小的存储缓冲区,它有助于表面之间的切换。
2.3 位块传送(bit block transfer)
是类似CDC类(设备描述表)的BitBlt()功能的函数,典型的Blt操作是将离屏表面的内容拷贝到一个后备缓冲区,而简单的说,Blt操作就是将一个表面的内容拷贝到另一个表面中。Blt还支持透明拷贝,就是指表面中某一像素在Blt过程中不被拷贝,这中方式我们将在后面的应用中大量使用,它可以帮我们完成不规则按钮、图标的实现。
2.4 色彩键码
DirectDraw可以把某种颜色或某个范围的颜色指定为一个颜色值,这个颜色值是由DDCOLORKEY结构说明的,DDCOLORKEY结构说明如下:
tpedef stuct _DDCOLORKEY {
DWORD dwColorSpaceLowValue; //颜色范围的低端
DWORD dwColorSpaceHighValue; //颜色范围的高端
} DDCOLORKEY;
当我们对表面进行拷贝时,色彩键码指定的颜色将不被拷贝。
3 DirectDraw的层次结构
DirectDraw提供完成以下关键任务的工具:管理多图面;直接访问显示存储器;页面翻转;后台缓冲区;调色板管理;剪裁。
DirectDraw通过一个设备相关的抽象层来访问硬件设备,DirectDraw尽可能地利用了硬件的加速特性,如果硬件不支持某特性,DirectDraw会使用HEL将该特性进行软件仿真。其层次结构如图1所示。
DirectDraw通过硬件抽象层(HAL)提供设备无关操作。HAL是由设备生产厂家提供的特定设备接口,DirectDraw直接对显示硬件进行操作,应用程序不直接与HAL交换数据,而是与HAL所提供的基础结构交换数据。
当硬件设备不支持某种特性时,DirectDraw会尝试软件仿真,仿真的功能是由硬件仿真层提供的。而这两种方式对于应用程序来说都是透明的,应用程序无需关心是硬件仿真还是软件仿真。
图2
4 基于DirectDraw的编程实例
在我们设计的车载综合信息平台上,图形化界面的操作都使用了DirectDraw来实现,对于应用程序层大量运用的按钮、列表框、菜单、编辑框、滑动条等Windows控件,如果我们只使用标准控件,那么对于应用程序的美观将大打折扣。此时,我们运用了DirectDraw来对这些控件进行封装,结合自己设计的图片完成了对控件的图形化封装,我们称之为SkinControl。在设计过程中,我们尽量保证具有图形化界面的控件与Windows标准控件具有相同或相近的接口定义,使得程序员在后面的开发中大大减少了工作。
以SkinButton(具有图形界面的按钮控件)为例,首先定义接口设置按钮的背景图片、图标、文字等基本信息,然后在OnPaint函数中将这些用户自定义的图片利用DirectDraw方式绘制到显示表面中,以实现按钮的图形化界面。下面我们给出程序设计中DirectDraw运用的流程图如图2所示。
实际上,不仅在控件表面的处理我们运用了DirectDraw技术,在整个程序中我们都运用了DirectDraw来绘图而放弃使用GDI绘图,因为在嵌入式设备上,图形显示的流畅度要求是非常高的,而我们使用的显卡又支持需要的特性。实践证明,使用DirectDraw实现图像显示,图像刷新速度快,画面无闪烁。
5 结束语
本文针对DirectDraw的特性讨论了其在嵌入式开发中的应用,面对嵌入式系统硬件环境不高,且显示要求又很高的实际情况,运用DirectDraw技术绘图是可以提高系统显示效果的有效方式。同时用DirectDraw将Windows控件进行图形化封装,不仅可以增加应用程序美观,还可以提高程序员编程效率。
参考文献:
[1] 武永康. DirectDraw原理与API参考[M].北京:清华大学出版社,2000.
关键词:DirectDraw;blt;DIB;SkinControl
中图分类号:TP317.4文献标识码:A文章编号:1009-3044(2008)24-1192-02
Embedded System Images Display with DirectDraw
HU Bin
(The 38th Institute of China Electronic and Technology Corp, Hefei 230001, China)
Abstract: Displaying computer images with DirectDraw has advantages of fast processing and no flickering. This paper introduces the brief principle of DirectDraw and presents an example using DirectDraw in an embedded system.
Key words: DirectDraw; blt; DIB; SkinControl
1 引言
嵌入式设备图形界面的开发由于硬件条件的限制,对实时性的要求非常突出。如果仍然使用Windows图形设备接口(GDI)来显示图片,将大大限制图形界面的显示速度。
目前比较流行的图形操作方式包括:GDI、OpenGL、DirectDraw三种方式,DirectDraw是DirectX基于COM接口的一个组件,它是DirectX的基石,DirectX的其它组件都是建立在它的基础之上的。DirectDraw允许直接操作显存、硬件位块转移、硬件覆盖和翻面支持。
2 DirectDraw基本要素
DirectDraw通过对显存中位图的直接访问,加速了对硬件和软件图形的实时处理,它提供了一种与设备无关的方法,以获得访问特定的显示设备高级特性的能力。
2.1 设备无关位图
在DirectX中使用设备无关位图(DIB)作为最基本的图形文件格式。DIB本质上是一个描述图像各种信息的文件,包括图像的尺寸、使用的颜色个数及颜色值,还有每个像素的颜色数据等。
2.2 表面(Surface)
在用DirectDraw绘图时,我们首先将图形数据放入创建的缓冲区,再进行转换、拉伸、拷贝等操作,最后显示缓冲区中的图形数据,这些缓冲区就称为表面。表面被分为主表面和离屏表面,主表面是显示内存的一部分,主表面一般情况下是存在两个表面,一个可见的,一个不可见的。不可见的表面被称为后台缓存(Back Buffering),在程序执行页面翻转(Page Flipping)的时候,后台缓存就称为了可见的表面,而原先可见的表面就称为了后台缓存。这样做是为了完成平滑、不闪烁的图像快速切换。
另一种表面称为离屏表面(Off_screen Surface),它始终是不可见的,是用户自定义的一个可变大小的存储缓冲区,它有助于表面之间的切换。
2.3 位块传送(bit block transfer)
是类似CDC类(设备描述表)的BitBlt()功能的函数,典型的Blt操作是将离屏表面的内容拷贝到一个后备缓冲区,而简单的说,Blt操作就是将一个表面的内容拷贝到另一个表面中。Blt还支持透明拷贝,就是指表面中某一像素在Blt过程中不被拷贝,这中方式我们将在后面的应用中大量使用,它可以帮我们完成不规则按钮、图标的实现。
2.4 色彩键码
DirectDraw可以把某种颜色或某个范围的颜色指定为一个颜色值,这个颜色值是由DDCOLORKEY结构说明的,DDCOLORKEY结构说明如下:
tpedef stuct _DDCOLORKEY {
DWORD dwColorSpaceLowValue; //颜色范围的低端
DWORD dwColorSpaceHighValue; //颜色范围的高端
} DDCOLORKEY;
当我们对表面进行拷贝时,色彩键码指定的颜色将不被拷贝。
3 DirectDraw的层次结构
DirectDraw提供完成以下关键任务的工具:管理多图面;直接访问显示存储器;页面翻转;后台缓冲区;调色板管理;剪裁。
DirectDraw通过一个设备相关的抽象层来访问硬件设备,DirectDraw尽可能地利用了硬件的加速特性,如果硬件不支持某特性,DirectDraw会使用HEL将该特性进行软件仿真。其层次结构如图1所示。
DirectDraw通过硬件抽象层(HAL)提供设备无关操作。HAL是由设备生产厂家提供的特定设备接口,DirectDraw直接对显示硬件进行操作,应用程序不直接与HAL交换数据,而是与HAL所提供的基础结构交换数据。
当硬件设备不支持某种特性时,DirectDraw会尝试软件仿真,仿真的功能是由硬件仿真层提供的。而这两种方式对于应用程序来说都是透明的,应用程序无需关心是硬件仿真还是软件仿真。

图2
4 基于DirectDraw的编程实例
在我们设计的车载综合信息平台上,图形化界面的操作都使用了DirectDraw来实现,对于应用程序层大量运用的按钮、列表框、菜单、编辑框、滑动条等Windows控件,如果我们只使用标准控件,那么对于应用程序的美观将大打折扣。此时,我们运用了DirectDraw来对这些控件进行封装,结合自己设计的图片完成了对控件的图形化封装,我们称之为SkinControl。在设计过程中,我们尽量保证具有图形化界面的控件与Windows标准控件具有相同或相近的接口定义,使得程序员在后面的开发中大大减少了工作。
以SkinButton(具有图形界面的按钮控件)为例,首先定义接口设置按钮的背景图片、图标、文字等基本信息,然后在OnPaint函数中将这些用户自定义的图片利用DirectDraw方式绘制到显示表面中,以实现按钮的图形化界面。下面我们给出程序设计中DirectDraw运用的流程图如图2所示。
实际上,不仅在控件表面的处理我们运用了DirectDraw技术,在整个程序中我们都运用了DirectDraw来绘图而放弃使用GDI绘图,因为在嵌入式设备上,图形显示的流畅度要求是非常高的,而我们使用的显卡又支持需要的特性。实践证明,使用DirectDraw实现图像显示,图像刷新速度快,画面无闪烁。
5 结束语
本文针对DirectDraw的特性讨论了其在嵌入式开发中的应用,面对嵌入式系统硬件环境不高,且显示要求又很高的实际情况,运用DirectDraw技术绘图是可以提高系统显示效果的有效方式。同时用DirectDraw将Windows控件进行图形化封装,不仅可以增加应用程序美观,还可以提高程序员编程效率。
参考文献:
[1] 武永康. DirectDraw原理与API参考[M].北京:清华大学出版社,2000.