李瑞齋??周健
摘要摘要:介紹了VxWorks系統及WindML,說明了基于WindML的窗口設計原理,重點闡述了窗口用戶圖形界面設計方法,討論了一些主要窗口部件設計原理及思路,給出了一些具體代碼示例。
關鍵詞關鍵詞:VxWorks;圖形界面;窗口部件
DOIDOI:10.11907/rjdk.143925
中圖分類號:TP316.7
文獻標識碼:A文章編號文章編號:16727800(2015)002004203
基金項目基金項目:2014年度河南省重點科技攻關項目(142102210499)
作者簡介作者簡介:吳秀才(1980-),女,河北衡水人,河南理工大學萬方科技學院公共基礎課教學部講師,研究方向為應用數學;李瑞齋(1980-),女,河南南樂人,碩士,鄭州大學西亞斯國際學院數理學院講師,研究方向為概率統計;周?。?964-),男,碩士,河南鄭州人,鄭州大學西亞斯國際學院數理學院講師,研究方向為物理教學。
1VxWorks概述
VxWorks系統是美國Wind River公司于1983年設計開發(fā)的一種嵌入式實時操作系統,它以卓越的可靠性和實時性被廣泛應用于通信、軍事、航空、航天等高技術領域 [1]。其內核具有很強的可裁剪性, VxWorks提供了WindML組件用來開發(fā)資源消耗較小的圖形界面,提高了系統的易用性,滿足了對系統界面有要求的用戶需求。
本文以Works5.5及其開發(fā)環(huán)境tomado2.2和組件WindML3.0為基礎介紹了窗口化圖形界面的設計。
2WindML概述
風河多媒體庫[2]WindML(Wind River MUlti-media Library)支持在嵌入式系統上運行多媒體應用程序,提供基本的圖形、視頻、音頻技術及標準設備驅動程序框架,其APl庫提供了圖形硬件接口和處理輸入輸出設備事件的能力。
WindML提供了軟件開發(fā)包(SDK)和驅動程序開發(fā)包(DDK)兩個組件。SDK用于開發(fā)應用程序,提供了用于圖形、輸入處理、多媒體、字體、內存管理的API庫。DDK用于實現驅動程序,可擴展和自定義。
3窗口化圖形界面程序設計原理
3.1基本概念
WindML圖形設計中的一些基本概念類似于常見的Windows系統下的Visual C++編程,如窗口實例、窗口類等,也有其特有的,如窗口管理器。一個窗口實例即一個可見的矩形窗口對象(包括帶框架的普通窗口、無框架窗、窗口部件等)。通過設定其對應屬性,可以實現移動、調整大小、重疊、包含于另外窗口的操作,通過編寫回調函數,可以響應各種消息,與輸入設備、其它窗口、應用程序進行互動。
窗口類定義了具有同樣屬性的某一類窗口,用于定義窗口部件,通過預先定義,這些窗口部件具有了特殊屬性、能力或默認數據。窗口類的源文件在編寫過程中,需要編寫消息處理器。消息處理器類似消息回調函數,用來響應消息,作出相應反應。消息處理器與回調函數不同之處在于前者關聯于窗口類,后者直接關聯于某一個窗口實例,并且在編寫回調函數時,將其返回值設定為UGL_STATUS_ FINISHED, 可以無視類的消息處理器,使消息不再進一步處理。
窗口管理器由多個源文件組成,包括窗口類文件、資
源預定義文件等,預定義了一些必要的資源和一些基本窗口類。窗口管理器類似設備驅動程序,為窗口應用程序的設計提供了方便的接口。合理利用窗口管理器可以在程序開發(fā)過程中提高效率,節(jié)省精力。WindML3.0提供了一個基本的窗口管理器WWM(WindML Windows Manager),封裝了16種顏色、光標圖形、3種字體,以及根窗口、框架類、按鈕類、任務欄按鈕、任務欄菜單等資源,可以直接使用。設計者可以靈活地自定義窗口管理器,以實現功能擴展。原則上WWM文件禁止更改,因為任何之后的WindML重裝、升級、補丁安裝等都可能覆蓋原來的文件[3],所作的修改也會丟失。因此最好的方法是新建一個窗口管理器。最簡易的方法是以原WWM的副本為基礎進行創(chuàng)建,大致過程為:在installDir/target/h/ugl/winMgr和installDir/target/src/ugl/winMgr下分別新建自定義的管理器目錄,復制原wwm目錄下的源文件到新目錄,再修改WindML數據庫配置文件即可,之后可任意修改窗口管理器文件夾內的源文件,添加新窗口類文件。
3.2窗口創(chuàng)建步驟
WindML的2D圖形庫提供了基本的繪圖操作和字體、位圖、光標、顏色、區(qū)域等管理器,窗口庫以2D圖形庫為基礎,封裝了用于窗口操作的API,利用它們創(chuàng)建基本的矩形窗口,不足之處是窗口過于簡單,而且沒有常用功能的窗口部件,需要自行擴展才能設計出高效、復雜的圖形界面。
窗口庫封裝了大部分必要的初始化操作,利用窗口管理器設計窗口應用程序更簡易。創(chuàng)建一個普通窗口的步驟為:①調用winAppCreate()創(chuàng)建窗口應用程序;②調用winCreate()創(chuàng)建服務于該應用程序的窗口; ③調用winCbAdd()為窗口加入回調函數,用來處理交互消息;④調用winAttach()綁定目標窗口到父窗口;⑤調用winAppDestroy()結束窗口應用程序,銷毀資源。
4設計方法
4.1基本窗口創(chuàng)建
4.1.1框架窗口與無框架窗口
在winCreate()參數中設置WIN_ ATTRIB_RRAMED屬性即可創(chuàng)建框架窗口??蚣艽翱谟蓛刹糠纸M成:窗口類預定義的外框和中間的內容窗。默認的框架類在窗口周圍繪制了一個邊界,可以通過修改窗口管理器框架類源文件,自定義框架顏色、邊界寬度等??梢杂檬髽送献б苿雍驼{整框架大小,且有最大化、最小化、關閉按鈕,也可以設置相應屬性來禁止這些按鈕。窗口庫提供有若干框架操作的API,可以設置或獲取框架、矩形位置等。
winCreate()參數中不設置框架屬性,因此創(chuàng)建出的窗口僅有一個內容窗而沒有框架。
4.1.2窗口基本繪圖
窗口繪圖原理與普通的2D圖形繪制一樣,使用基本的2D圖形庫API,但某些步驟,如圖形環(huán)境變量的創(chuàng)建和配置等被封裝在窗口庫中,使用起來更方便。窗口繪圖方法有兩種:異步繪圖和同步繪圖。
異步繪圖是較常用的繪圖方法,通過響應繪圖消息MSG_DRAW,在回調函數中編寫繪圖代碼,能夠動態(tài)地繪制窗口內容,在窗口移動后或因遮蓋物移走而重新暴露后自動更新、重繪窗口。
同步繪圖是靜態(tài)的,通過調用winDrawStart()和winDrawEnd()在任何時候都可以進行繪圖操作,其間利用基本繪圖函數編寫具體的繪圖代碼。這種繪圖方法是一次性的,不能自動重繪,因此不太常用。
4.2窗口部件
一個窗口化圖形界面需要眾多窗口部件來實現各種功能,但WindML的窗口庫僅提供了一個基本窗口創(chuàng)建函數winCreate(),對于復雜界面來說是遠遠不夠的,因此需要花費一定的工作量自定義窗口部件。默認的窗口管理器提供了幾個基本的窗口部件類,包括按鈕、任務欄、菜單,可以此為基礎進行擴展。
4.2.1按鈕
按鈕在圖形界面開發(fā)中是最常見的,WWM默認的按鈕類中提供了一些很有用的函數:按鈕創(chuàng)建、文本設置、字體設置及獲取、按鈕顏色設置。
按鈕類消息處理器處理的一些主要消息有:
MSG_DRAW:繪制有立體感的按鈕外觀,包括邊界色和背景色;
MSG_BUTTON DRAW:繪制按鈕文本;
MSG_MANAGE:分配資源(設置默認字體和顏色);
MSG_UNMANAGE:銷毀資源;
MSG_PTR_BTNl_DOWN:重新繪圖,模擬鼠標左鍵按下時按鈕下沉的外觀;
MSG_PTR_BTNI_UP:重新繪圖,模擬鼠標左鍵彈起時按鈕彈起的外觀。
在按鈕MSG_BUTTON_DRAW的消息處理器中,繪圖代碼的原型是直接以單字節(jié)文本繪制,可以修改為先判斷按鈕字符串是英文還是中文,再根據判斷結果進行繪制,大致流程如圖1。
圖1按鈕繪制函數流程
4.2.2文本框
文本輸入框也是窗口界面設計中常用的窗體,是用戶進行數據輸入的典型窗口部件。默認窗口管理器并沒有提供文本框類,設計者可以按照按鈕類自行設計。
4.2.3其它部件
默認的菜單類和任務類能夠在任務欄菜單中添加菜單項或添加任務欄按鈕,可以改進和擴展源文件以滿足實際開發(fā)的需要。其它沒有提供的窗口部件類可像前文介紹的文本框類一樣,自行在窗口管理器中設計添加。
4.3代碼示例
下面以一個簡單的系統登錄界面為例,給出部分代碼:
/*創(chuàng)建窗口應用程序*/
appId=winAppCreate("winsysLogin”,0, 0, 0, UGL_ NULL);
……
/*創(chuàng)建主窗口,居中置頂*/
winLoginld=winGreate(appId,UGL_NULL, WIN_ATTRIB_VISIBLE|WIN_ATTRIB_TOPMOST,
(displayWidth-300)/2,(displayHeight-200)/2,
300, 200, UGL_NULL, 0, UGL_NULL);
winCbAdd (winLoginId, MSG_DRAW, 0, (WIN_CB*)cbWinLoginDraw,UGL_NULL);
winCbAdd(winLoginId,MSG_MANAGE,O,(WIN_CB*)cbWinLoginManage,UGL_NULL);
winCbAdd(winLoginId,MSG_UNMANAGE,O,(WIN_CB*)cbWinLoginUnmanage,UGL_NULL);
winAttach(winLoginId,UGLNULL_ID,UGL_NULL_ID);
/*創(chuàng)建取消按鈕*/
btnCanceIId=wwmButtonCreate (appld,“取消", 200,170,50,20,UGL_NULL, 0, UGL_NULL);
wincbAdd(btnCancelId,MSG_BUTTDN_Select,UGL_NULL);
winAUath(btnCancelld,WinLoginId,UGL_NULL_ID);
…
/*創(chuàng)建輸入框*/
tboxUserId=wwmTextboxCreate(appld,8,110,65,100,20,UGL_NULL,0,UGL_NULL);
tboxPwdId=wwmTextboxCreate(appld,8,110,110.l00,20,UGL_NULL,0, UGL_NULL);
winAttach(tboxUserId,winLoginld,UGL_NULL_ID);
winAttach(tboxPwdId,winLoginId,UGL_NULL_ID);
/*MSG_DRAW的回調函數部分內容*/
rect=pMsg->data.dxaw.rect;
gcId=pMsg->data.draw.gcId;
/*繪制窗體內的文本*/
uglLineWidthSet(gcId,l);
uglBackgroundColorSet(gcId,UGL_COLOR_TRANSPARENT);
uglForegroundColorSet(gcId,WIN_ RED);
uglFontSet (gcId, WIN_FONT_SONG24);
pText=“系統登錄”;
uglTextSizeGetW(WIN_FONT_SONG24,&width,&height,strlen(pText)/2,
(UGL_WCHAR *)pText;
uglTextDrawW(gcId,(rect.left+rect.right-width)/2,20,strlen(pText)/2,(UGL_WCHAR*)pText);
/*繪制輸入框前的提示文本*/
uglForegroundColorSet(gcId,WIN_BlACK);
uglFontSet(gcId,WIN_FONT_SONG12);
pText=”賬號”;
uglTextDrawW(gcId,70,65,strlen(pText)/2,(UGL_WCHAR*)pText);
pText=”密碼:”;
uglTextDrawW(gcId,70,110,strlen(pText)/2,(UGL_WCHAR*)pText);
5結語
本文討論了VxWorks下基于WindML的窗口化圖形界面設計基本原理和方法。在實際開發(fā)測試中,WindML具有方便靈活、開發(fā)自由度較大、消耗資源較少的特點,是VxWorks系統下開發(fā)圖形用戶界面的有力工具。
參考文獻參考文獻:
\[1\]陳翌,田健,王金俐.嵌入式軟件開發(fā)技術[M].北京:國防工業(yè)出版社,2003.
[2]WIND RIVER SYSTEMS INC.WindML SDK programmers guide 3.0 [EB/OL].http://www.doc88.com/p-14465587484.html,2002.
[3]WIND RIVER SYSTEA INC. WindML DDK programmers guide 3.0[Z].Alameda: Wind River Systems Inc,2002.
責任編輯(責任編輯:杜能鋼)