在常見的移動終端等小型手持式設備上,由于硬件條件等的限制,我們看到的用戶界面都非常簡單,幾乎看不到PC機上華麗美觀的GUI 支持。隨著硬件條件的提高,移動終端的嵌入式系統(tǒng)對輕量級GUI的需求會越來越迫切。
用戶界面是指計算機與其使用者之間的對話接口[1],它為用戶提供與應用系統(tǒng)交互的可視化通道,同時為程序員提供了一種編程模式,即GUI負責系統(tǒng)的可視化界面的生成、管理以及系統(tǒng)與用戶之間的信息交互[2-3],而程序員只需專注于對實際應用的分析。
1. GUI在移動終端中的作用
圖1顯示大部分移動終端軟件的系統(tǒng)架構,由圖可以清晰看出,GUI在移動終端系統(tǒng)中扮演著很重要的角色,它運行在操作系統(tǒng)抽象層(OSAL)之上,為應用程序提供基于消息機制的圖形用戶界面編程接口。GUI與其它一些應用引擎一起為實現豐富的移動終端應用而提供支持,從而將應用程序的計算部分與界面分離開來,這樣就充分保證了根據不同需求快速定制出功能強大界面豐富的應用程序界面。
圖1 移動終端軟件架構
2. GUI層次結構
從整體結構上看GUI是分層設計的,其主要成分為層次結構見圖2,它的主要組成部分是 :顯示驅動、GDI接口、消息隊列和窗口管理四部分。
圖2. GUI層次結構
2.1 顯示驅動
顯示設備和打印設備一同組成圖形設備,圖形設備抽象層(GAL)定義了一組不依賴于任何特殊硬件的抽象接口,所有頂層的圖形操作都建立在抽象接口之上。而用于實現這一抽象接口的底層代碼類似操作系統(tǒng)中的驅動程序。
顯示設備驅動作為GUI最底層驅動,通過顯示設備驅動程序接口(DDI)給上層GDI函數一些基礎的功能和設施??梢钥闯墒荊DI的圖形驅動程序,并將底層圖形設備和上層接口分離開來。
DDI用GAL中的函數標準結構表示,統(tǒng)一成標準的驅動接口結構,保證顯示對窗口透明。主要DDI函數包括:對顯示設備進行初始化,管理顯示內存使用和為上層GDI提供映射到物理地址空間以及諸如調色板等物理地址上的相關處理。
2.2 GDI接口
GUI系統(tǒng)的一個重要組成部分就是GDI,即圖形設備接口(Graphics Device Interface)。通過GDI,GUI程序就可以在計算機屏幕上,或者其他的顯示設備上進行圖形輸出,包括基本繪圖和文本輸出。
GDI重要函數包括:圖形設備上下文管理、繪圖函數和使用GDI對象的函數
2.2.1圖形設備上下文管理函數[!--empirenews.page--]
要在圖形輸出設備上繪制圖形,在調用圖形輸出函數時,均要求指定經初始化的圖形設備上下文(Device Context,DC),也稱作"設備環(huán)境"。設備上下文是連接應用程序、設備驅動程序以及輸出設備的紐帶,見圖3。設備上下文包含許多屬性,當需要修改這些屬性時,只需調用一個GDI函數修改設備上下文中屬性的參數。
圖3. 設備上下文
一個圖形設備上下文所代表的含義很復雜,它起碼應該包含如下內容[5]:
· 該設備上下文本所在設備信息(顯示模式、色彩深度、顯存布局等等);
· 該設備上下文所代表的窗口以及該窗口被其他窗口剪切的信息
· 該設備上下文的基本操作對象(筆、刷子、字體、位圖、區(qū)域等),及其上下文信息;
· 由程序設定的局部信息(繪圖屬性、映射關系和局部剪切域等)。
2.2.2 繪圖函數
設備上下文的屬性決定了有關繪圖函數如何工作的細節(jié)。通過繪圖函數應用程序能夠方便地畫出直線、矩形、圓、橢圓和其它復雜圖形,而不需直接與具體的輸出設備打交道。
2.2.3使用GDI對象的函數
當調用繪圖函數時,使用當前設備上下文中選擇的GDI對象來進行繪圖。GDI共有筆、刷子、字體、位圖、區(qū)域和邏輯調色板六個對象。
例如可以通過在CreatePen、 CreatePenIndirect或ExtCreatePen函數中指定這些特征來建立一個邏輯畫筆,這些函數傳回一個邏輯畫筆的句柄。要使用這個畫筆,就要用SelectObject將畫筆句柄選進設備內容。這樣,畫任何線都使用這個畫筆,然后可以取消設備內容中的畫筆選擇,并清除畫筆對象。清除畫筆對象是必要的,因為畫筆定義占用了分配的內存空間。
除了畫筆以外,GDI對象還用于建立填入封閉區(qū)域的畫刷、字體、位圖以及GDI的其它一些方面。
2.3 消息隊列
移動終端產生的消息主要包括:按鍵事件消息、協議棧消息及自定義消息等。按鍵一般有12個標準電話按鍵、左右2個軟鍵、5個導航鍵(上、下、左、右、中) 、撥號鍵和掛機鍵,由此可產生對應的短按鍵及長按鍵消息。按鍵的按下及釋放產生按鍵事件,對比鍵碼表對按鍵事件進行解碼,獲取正確的按鍵消息。按鍵消息經消息過濾后送往當前焦點窗口。GSM 協議棧消息是由手機平臺產生的送往消息隊列的協議棧消息,主要是網絡事件及手機狀態(tài)的響應消息,包括所有對SIM卡、網絡狀態(tài)、通話、短消息等的響應消息。協議棧消息需傳送到賦于系統(tǒng)窗口屬性的窗口,但窗口并不需要對每一項協議棧消息進行處理,只依據窗口函數的具體屬性定義進行消息響應。
GUI采用消息驅動機制,把上面這些消息收集在一個消息隊列中,然后將這些消息連同定時器和重畫消息一起放入應用程序消息隊列中。應用程序消息隊列是屬于各個應用程序所有的先進先出隊列。但是定時器消息和重畫消息保留在隊列中直到應用程序處理完所有其它消息后才予以處理。GUI將屬于一個特定應用程序的消息放入該應用程序的消息隊列中,然后應用程序讀取這些消息,并將它們發(fā)送給相應的窗口函數。[!--empirenews.page--]
GUI將某些消息直接發(fā)送給應用程序的窗口函數,而不是將它們放入到應用程序隊列中,這樣的消息稱為非排隊消息。通常,非排隊消息是那些僅影響該窗口的消息。雖然大多數消息都由GUI產生,但應用程序也可以產生自己的消息并將其加入到應用程序隊列中。
一旦應用程序的主函數從隊列中獲取了消息,就可以將消息傳送給相關窗口的窗口函數,并把消息的內容作為參數傳遞過去,這樣,窗口函數就可以處理這個消息,完成相應的工作。當窗口函數返回后,GUI將控制權返回給主函數。主函數可以再從隊列中取出下一消息進行處理。
2.4 窗口管理
窗口是終端應用程序的主要輸入輸出設備。應用程序只有通過窗口才能訪問顯示設備。窗口由標題條、菜單條、滾動條、邊框以及在顯示設備上的矩形框里出現的其它特性組成。當創(chuàng)建窗口時,可為窗口指定所要求的特性,然后GUI畫出此窗口并管理它。
雖然應用程序創(chuàng)建了某一窗口,并且從技術上來說可以獨占它,但該窗口的管理實際上是由應用程序與GUI相互協作來實現的。GUI管理窗口的位置和顯示方式,并管理窗口的標準特性,如邊框、標題等,同時完成許多由用戶初始化并直接影響窗口的任務。而應用程序則管理窗口的其它所有工作,特別是負責管理窗口的“客戶區(qū)”(窗口邊框以內的區(qū)域)。應用程序可完全控制屬于自己的窗口客戶區(qū)的顯示。
為管理這一協作任務,GUI告知每個窗口其變化可能要受到影響。因此,每個窗口必須具有相應的“窗口函數”,用于接收窗口管理消息。窗口管理消息既可指定該函數要執(zhí)行的動作,也可請求該窗口函數返回信息。
窗口函數作為窗口最重要的基本屬性,處理所有傳送到本窗口的消息。窗口的表現及行為特征是由窗口函數定義的對消息的處理所決定的。在正常情況下,具體的窗口函數只處理部分指定的消息,而正是這部分特定消息的處理決定了各個窗口的不同特性。通過調用窗口函數,將消息參數傳遞到所指定的窗口函數,由窗口函數依據消息所攜帶的消息參數進行判斷處理。對絕大部分消息只需將其送往缺省窗口函數進行處理。缺省窗口函數集成了標準窗口函數對消息的標準處理,是對所有窗口函數的一個共性集合窗口管理收集所有的輸入信息,然后把這些輸入信息以消息的形式送往合適的窗口。這些消息的執(zhí)行結果又可能產生新的消息,新消息的傳送仍由窗口管理負責。窗口管理通過調用窗口函數,向窗口函數傳遞消息參數,把消息送到目的窗口。在移動終端中,采用消息分派技術將協議棧消息依次發(fā)往所有具有系統(tǒng)屬性的窗口。通過窗口樹表將非協議棧消息送往所獲取的當前焦點窗口。
3. GUI調用流程
下面通過一個具體例子分析GUI函數調用流程:移動終端的窗口系統(tǒng)初始化時首先要創(chuàng)建一個菜單,在注冊菜單窗口類時將菜單序號圖片全部按順序讀入內存,這就需要GDI用畫刷對象來進行矩形填充,下圖清晰的顯示了GUI在注冊這個窗口類時各層調用的流程。
圖4. GUI調用流程
4. 結語
GUI系統(tǒng)是一項復雜的軟件工程,本文設計和實現的GUI占用資源少、可配置,特別適用于移動終端。它給終端上層應用提供了一個清晰的圖形界面。同時,在將它用于多種終端平臺時還要盡可能考慮它的可擴展性、兼容性、可移植性等屬性。