洪運國,謝 堯
大連職業(yè)技術學院信息工程學院,遼寧大連 116035
近年來,UCGUI[1]畫圖系統(tǒng)在嵌入式領域的應用越來越廣。幾乎每一項嵌入式項目的開發(fā)都會大量的應用到UCGUI,有了UCGUI畫圖系統(tǒng)的支持,在ARM板上就可以畫出許多生活中常見的簡單圖形,將這些簡單的圖形組合在一起就實現(xiàn)了很多平時看起來很難畫的實際物體,最明顯的應用要屬儀表,利用UCGUI可以在開發(fā)板上畫出很漂亮的儀表,然后應用到生活中,例如汽車儀表等。
近20年來,隨著嵌入式領域的蓬勃發(fā)展,UCGUI的研究也取得了突破性的進展。許許多多的新的API被加入了進來,簡化了之前很多復雜的圖形繪制,還有一些函數(shù)的加入實現(xiàn)了之前沒有的功能。有了越來越多的函數(shù),UCGUI的功能也隨之越來越強大,在開發(fā)板上燒出的效果也越來越好。本設計通過VC6.0中的模擬器,展現(xiàn)出在實際開發(fā)板上一模一樣的效果。設計添加算法實現(xiàn)了許多基本圖形的繪制,還有儀表,趨勢圖,進度條,刻度尺,指示燈等單體控件以及顯示動畫,所以本設計對研究嵌入式和計算機圖形領域有一定的基礎意義。
UCGUI所提供的函數(shù)接口是重中之重,所有圖形的繪制都需要使用UCGUI提供的接口函數(shù),UCGUI將每個基本圖形的畫法實現(xiàn)封裝成一個函數(shù),然后直接調用就可以畫出基本的圖形,至于復雜的圖形,需要基本圖形的拼接,一些復雜的動態(tài)功能,UCGUI也提供了處理方法,例如內存的分配,圖形繪制時的抗鋸齒,各種窗口控件的實現(xiàn)等。
UCGUI中提供的基本圖形繪制函數(shù)[2]很多,其中應用較廣的有,圓,矩形,多邊形,橢圓,點,線,折線等,這些圖形的實現(xiàn)只需要調用UCGUI相應的函數(shù)即可,其中畫點的函數(shù)還可分為畫點和畫像素點,圓,矩形,橢圓和多邊形也分為畫輪廓和填充兩種。畫線的函數(shù)中包含了畫線,畫水平線,畫垂直線。
趨勢圖的畫法集中于兩點,一個是靜態(tài)的布局,一個是動態(tài)的顯示,其中布局是畫趨勢圖的難點,在畫之前一定要先設計好布局,正確的理解每一個區(qū)域所存在的意義,其中最復雜的地方是計算每一個區(qū)域的坐標值,稍有馬虎,畫出來的圖形就達不到預想中的效果。
刻度尺是日常生活中最常見的控件,雖然看起來刻度尺似乎并不難畫,但是實際上并不像想象中那么簡單,刻度尺根據(jù)軸的位置分為6種狀態(tài),分別為軸水平居中,軸在上,軸在下,軸垂直居中,軸在左,軸在右。畫刻度尺的難點在于刻度線的分配和刻度值的顯示,其中在分配刻度線時需要仔細,其中牽扯到浮點數(shù)的運算,要把精確度提高,以免顯示時軸與刻度線的位置不協(xié)調。
進度條的繪制是一個反復繪制矩形的過程,首先要將背景矩形繪制出來,之后通過反復的計算,不斷地調用GUI_FillRect()函數(shù)[3]來填充每次計算出的矩形區(qū)域,同時數(shù)字的顯示牽扯到數(shù)字透過的效果,必須設定數(shù)字的顯示效果為GUI_Mode_Trans,這樣在循環(huán)顯示數(shù)字時,才能不被填充矩形所覆蓋。
儀表的實現(xiàn)是最復雜的過程,由于儀表指針的移動會留下痕跡,所以儀表盤會被覆蓋,為了避免這個問題,決定將儀表畫在一塊內存區(qū)域上,這樣每次指針一移動,就在這塊內存區(qū)域上重新繪制整個儀表,這樣表盤指針移動的痕跡就不會留下了。儀表的繪制分為兩個部分,表盤和指針,分別通過GUI_DrawArc()函數(shù)[4]和GUI_DrawPolygon()函數(shù)[5]實現(xiàn)。
動畫其實就是把一些圖片連在一起播放,uCGUI能夠處理的圖片有3種格式,BMP,JPG和GIF,一般情況下我們使用BMP格式的圖片。圖片信息利用文件系統(tǒng)讀取,之后調用GUI_DrawBMP()把圖片放到指定的坐標位置,然后調用GUI_Clear()清屏,再把下一張圖片畫上去,反復這個過程就能達到動畫的效果。
動畫的顯示一直是一個難點,因為它是大量的圖片文件,這些圖片非常占內存,做嵌入式的開發(fā),內存是一個主要考慮的方面,因為一塊開發(fā)板上的內存非常有限,每一次需要申請內存時都需要仔細的計算,爭取一點內存都不要浪費。而圖片是非常占內存的,動畫需要大量的圖片,所以要想很好的顯示,板子上的內存一定要好好的處理,或者將圖片讀取到flash中去,或者加大RAM的大小,再或者再加一個RAM。
UCGUI提供了很多處理圖片的函數(shù),能處理包括BMP,JPG,GIF三種格式的圖片。同時UCGUI也提供了將圖片放大縮小的函數(shù),這樣所讀取的圖片大小將不受限制。動畫的顯示還需要GUI_Delay
動畫是由圖片組成的,顯示動畫的函數(shù)通過APP_GetData()函數(shù)[6]將圖片的信息讀取到一個數(shù)組中,然后調用DXCMD_DRAW_BMP()函數(shù)與DXCMD_DRAW_JPG()函數(shù)將圖片顯示到模擬器上。在這兩個函數(shù)中都選擇用DrawScaledEx的形式來顯示,這樣可以對圖片進行放大與縮小的操作,能保證圖片以一個適中的大小顯示在模擬器上。
圖片動畫函數(shù)[7]以GUI_BMP_DrawScaledEx()和GUI_JPEG_DrawScaledEx()函數(shù)為主題,利用數(shù)組將圖片信息讀取,讀取圖片信息是一個難點,下面是對圖片讀取的部分關鍵代碼。
控件庫[8]設計完成后,需要在Application中設計調用函數(shù),我們?yōu)槊恳粋€控件都設計了一個與之對應的調用函數(shù),我們?yōu)檫@些調用函數(shù)設計了一個名為DXExec.h的頭文件,所有調用函數(shù)都在DXExec_OS.c文件中的路由表中聲明它們的執(zhí)行順序。
調用函數(shù)中首先將控件所需要的參數(shù)值傳遞進來,之后調用EC_DEMO_ShowIntr()函數(shù)[9]將所畫控件的名字輸出到模擬器上,之后設置背景顏色,我們這里都設置背景色為黑色,之后調用GUI_Clear(),這步是必不可少的,不然的話當畫面進行遷移的時候,上一個畫面所繪制的控件并沒有被清除,兩個控件就會出現(xiàn)重疊,所以每一個調用函數(shù)中都要有GUI_Clear()函數(shù),目的是清除上一個頁面所繪制的控件。
基于ARM的畫圖工具的設計與開發(fā)的開發(fā),充分利用UCGUI的特性,幾乎所有的圖形都是通過矢量畫出來的,這樣的效果在開發(fā)板上會非常好,板子上不會出現(xiàn)閃的情況。UCGUI具有廣闊的發(fā)展空間,相信在生活中它的應用會越來越廣,隨著其版本的不斷更新,功能的不斷增加,ARM板上能呈現(xiàn)出的圖像也會越來越真實。
[1]馬曉波,Guy L.嵌入式GUI的研制[M].成都:電子科技大學,2003:43-80.
[2]單博煒.嵌入式GUI的研究與實現(xiàn)[M].西安:西北工業(yè)大學出版社,2004:57-92.
[3]肖俊芳,王正勇.基于嵌入式的UCGUI圖形用戶界面系統(tǒng)設計[M].成都:成都信息工程學院,2008:30-85.
[4]布蘭切特.C++GUI Qt4編程[M].北京:電子工業(yè)大學出版社,2008:26-89.
[5]徐寶國.基于UCOS和UCGUI的嵌入式數(shù)字示波器[J].測控技術,2007(6):118-121.
[6]孫曉輝,陳曉.基于UCGUI的圖形系統(tǒng)在機頂盒中的應用[J].中國有線電視,2007(2):113-117.
[7]劉堯猛,馬永軍.基于ARM9和FPGA的嵌入式數(shù)字示波器[J].計算機應用與軟件,2010(27):287-289.
[8]吳麗彬.嵌入式μCGUI圖像自適應滑動窗口的實現(xiàn)[J].計算機工程與應用,2010(26):184-187.
[9]姜文濤.基于ARM與圖像仿真的無線測控終端[J].計算機工程,2011(1):244-247.