摘要:用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會嘗試軟件仿真,仿真的功能是由硬件仿真層提供的。而這兩種方式對于應用程序來說都是透明的,應用程序無需關心是硬件仿真還是軟件仿真。

圖1

圖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.