Windows Embedded 系統(tǒng)應(yīng)用軟件框架設(shè)計(jì)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
(1)(工業(yè))控制
(2)醫(yī)療
(3)瘦客戶機(jī)
(4)探測(cè)儀器一類
(5)車載
(6)電梯的轎內(nèi)顯示器
(7)PND
(8)測(cè)試儀表
工控領(lǐng)域,使用 Windows XP Embedded 的比較多,當(dāng)然也有用到 Windows CE 系統(tǒng)。在消費(fèi)類電子領(lǐng)域,如車載、PND等,使用 Windows CE 的產(chǎn)品比較多。
由于 Windows Embedded 系統(tǒng)的標(biāo)準(zhǔn)窗體界面無法滿足車載及其它產(chǎn)品的需求,主要是因?yàn)橛脩粼谛∑聊坏脑O(shè)備上操作系統(tǒng)提供的控件不方便。其實(shí),在 PC 上也常見此種實(shí)現(xiàn)方式,例如:銀行的一些客戶終端,使用的是 Windows XP 系統(tǒng),但從界面上是看不到系統(tǒng)提供的哪些控件,也感覺不到使用的是 Windows XP 系統(tǒng)。
一般使用 Windows Embedded 的產(chǎn)品都會(huì)采用自定義、個(gè)性化的 UI。UI 的實(shí)現(xiàn)方案也是千差萬別,操作方便、美觀是最基本的要求。其它如擴(kuò)展性、穩(wěn)定性等等要求,在設(shè)計(jì)時(shí)也是必須要考慮的。
整個(gè)框架暫且不說,比如功能的擴(kuò)展性等,先簡(jiǎn)單說說 UI 最終的實(shí)現(xiàn)方法,即 UI 是如何呈現(xiàn)給用戶的。
(1) 使用 GDI 貼圖可能是大家最容易想到,是的,這確實(shí)是最通用的。其對(duì)系統(tǒng)的要求也比較低,不必考慮硬有件是否支持;
? ? 如果使用 GDI 感覺速度不能滿足要求,可以參考通過顯示驅(qū)動(dòng),直接寫顯存。這種方法,需要驅(qū)動(dòng)人員配合,在定制系統(tǒng)時(shí)提供相應(yīng)的接口,一般通過 IOControl 來實(shí)現(xiàn)。
(2) 為了實(shí)現(xiàn)一些特殊的效果,在產(chǎn)品方案支持的情況下使用 overlay 結(jié)合貼圖,利用 overlay 的特性完成 UI 之間的快速切換。例如:使用以下 CPU 的方案Telechips、SiRF Prima、iMX,MStar785等使用 Overlay 是沒有問題的;但 SiRF A5、MStar 2521等低端的 CPU 則不支持。
這兩種方案,基本上都是使用 Windows Embedded 系統(tǒng)提供的功能。
(3) 使用諸如 Open GL ES 做出的支持較好的動(dòng)畫效果的 UI。
(4) 使用 Windows Embedded 新特性的 Silverlight 來實(shí)現(xiàn)的 UI 產(chǎn)品,現(xiàn)在也慢慢的出現(xiàn)在車載系統(tǒng)中。但使用 Silverlight 對(duì)系統(tǒng)的硬件配置要求比較高,現(xiàn)在也只出現(xiàn)在一些高端的產(chǎn)品中。
(5) 第三方工具或開源項(xiàng)目,例如:QT、MiniGUI。
接下來說說框架,在 Windows Embedded 下編程,怎么也逃脫不了 Windows 消息框架,至于是使用 MFC 還是使用 Win32 編程,那可以說是仁者見仁智者見智。但無論選用哪一種,它也只是一個(gè)基礎(chǔ)。UI 框架如何設(shè)計(jì),功能如何與 UI 完美的結(jié)合,以達(dá)到修改 UI 時(shí)盡可能不去關(guān)心功能代碼?這也是 Silverlight 推出時(shí)的設(shè)計(jì)想法:UI 設(shè)計(jì)和實(shí)現(xiàn),與功能的實(shí)現(xiàn)分開。這種分開,個(gè)人認(rèn)為簡(jiǎn)單的說就是耦合度降到最低,不可能徹底分開的。UI 與功能之間一般通過消息、回調(diào)或定時(shí)等機(jī)制結(jié)合在一起。例如有一種使用定時(shí)刷新的
UI 方案,界面刷新的工作由一個(gè)獨(dú)立的線程控制,定時(shí)檢查各 UI 控件是否需要刷新、及如何刷新?功能模塊在功能實(shí)現(xiàn)時(shí),只需要觸發(fā)控件的刷新標(biāo)志即可。
例如如下刷新線程與功能代碼:
//?刷新線程代碼:?刷新各類型控件 while { ???//?字符串顯示控件 ???foreach(各個(gè)字符串控件) ???{ ??????if(控件.bRefreshFlag)?//?如果控件的刷新標(biāo)志 ??????{ ?????????控件.bRefreshFlag?=?FALSE; ?????????//?刷新操作 ??????} ???} ???//?按鍵控件 ???foreach(各個(gè)按鍵控件) ???{ ??????if(控件.bRefreshFlag)?//?如果控件的刷新標(biāo)志 ??????{ ?????????控件.bRefreshFlag?=?FALSE; ?????????//?刷新操作 ??????} ???} ???//?......?????????????????????//?其它類型控件 ????Sleep(50); } //?功能代碼 //?功能:?字符串顯示控件功能代碼 //?參數(shù)說明:??csStr?控件顯示的字符串;?bRefreshFlag?刷新控件標(biāo)志 void?StrSettingFunction(CString?&csStr,BOOL?&bRefreshFlag) { ???//??根據(jù)功能代碼賦值新的字符串 ???CString?csNewStr; ???if(條件1) ??????csNewStr=?L"XXX"; ???else ??????csNewStr?=?L"YYY"; ???if(csStr?!=?csNewStr) ???{ ??????csStr?=?csNewStr; ??????bRefreshFlag?=?TRUE;?//?賦值刷新標(biāo)志 ???} } //?功能:?按鍵控件功能功能代碼 //?參數(shù)說明:??bEnable?按鍵使能標(biāo)志(對(duì)應(yīng)顯示Enable/Disable圖片);?bSelect?按鍵按下或選中圖片;?bRefreshFlag?刷新標(biāo)志 void?BtnSettingFunction(BOOL?&bEnable,BOOL?&bSelect,BOOL?&bRefreshFlag,...) { ???BOOL?bNewEnable; ???BOOL?bNewSelect; ???if(條件1) ??????bNewEnable?=?TRUE; ???else ??????bNewEnable?=?FALSE; ???if(條件2) ??????bNewSelect?=?TRUE; ???else ??????bNewSelect?=?FALSE; ???if(bEnable?!=?bNewEnable) ???{ ??????bEnable?=?bNewEnable; ??????bRefreshFlag?=?TRUE;?//?賦值刷新標(biāo)志 ???} ???if(bSelect?!=?bNewSelect) ???{ ??????bSelect?=?bNewSelect; ??????bRefreshFlag?=?TRUE;?//?賦值刷新標(biāo)志 ???} }
以上功能函數(shù)只是一個(gè)示例,例如:按鍵控件可能需要顯示字符串,其必然包含一個(gè)與字符串顯示類似的函數(shù)。各個(gè)控件都會(huì)有顯示/隱藏屬性,這個(gè)在功能代碼中也需要體現(xiàn)出現(xiàn)。為了方便控件布局,一般都會(huì)支持子窗口,這是一個(gè)多個(gè)功能的集合。
將 UI 與功能分開,是框架設(shè)計(jì)的核心思路。分層的好壞,決定了后繼開發(fā)與維護(hù)的難易程度。
如何使 UI 的設(shè)計(jì)具有簡(jiǎn)單、方便的移植性?這是大家在設(shè)計(jì)時(shí)都會(huì)考慮的內(nèi)容。只所以這樣考慮,是想在功能不變、或簡(jiǎn)單變化的情況下,能快速完成修改、且保證產(chǎn)品的穩(wěn)定性。特別是一些車載方案公司,對(duì)于一些要求不高的小客戶在快速確定 UI 后幾天就可以完成產(chǎn)品的交付。這種修改,一般包括換圖和圖片位置的調(diào)整。如何簡(jiǎn)單有限的記錄圖片與圖片的位置等信息呢?早在幾年前,就有通過簡(jiǎn)單的格式化文本來完成的方案。后來標(biāo)記語(yǔ)言興起,在嵌入式方案中也得到廣泛應(yīng)用,特別是 XML 語(yǔ)言。XML 語(yǔ)言的特點(diǎn)這里就不多說了,有興趣的童鞋在網(wǎng)絡(luò)上查找一下,就能得到答案。在這些方案中,都有用到圖片處理的技術(shù),以實(shí)現(xiàn)透明、半透明等效果。圖片一般采用
BMP 和 PNG 格式,為了方案的保密性等其它一些考慮,圖片一般通過工具打包,甚至于,XML 文件也一起打包。這樣在不了解打包后文件格式的情況下,客戶就必須依賴于軟件設(shè)計(jì)者。將 UI 部分通過可視化工具來實(shí)現(xiàn),可以大大加快 UI 的開發(fā)速度。一般是通過 PC 上的程序來直接操作,剛剛畢業(yè)的學(xué)生在經(jīng)過2到3天的培訓(xùn),就可以完成 UI 部分的工作。
以上三部分結(jié)合在一起,就構(gòu)成了車載應(yīng)用系統(tǒng)中單個(gè)應(yīng)用軟件的框架:控件/子窗體/完整的界面。再給合一個(gè)對(duì)多個(gè)應(yīng)用控制的邏輯,完成應(yīng)用啟動(dòng)/關(guān)閉(顯示/隱藏)等的控制,以完成一個(gè)完整的系統(tǒng)的設(shè)計(jì)實(shí)現(xiàn)。