車載系統(tǒng)之 Windows CE 應用軟件框架設計
掃描二維碼
隨時隨地手機看文章
整個框架暫且不說,先簡單說說 UI 最終的實現(xiàn)方法。使用 GDI 貼圖可能是大家最容易想到,是的,這確實是最通用的。其對系統(tǒng)的要求也比較低,不必考慮硬有件是否支持;其次,為了實現(xiàn)一些特殊的效果,在產(chǎn)品方案支持的情況下使用 overlay 結(jié)合貼圖,利用 overlay 的特性完成 UI 之間的快速切換。例如:使用以下 CPU 的方案Telechips、SiRF Prima、iMX,MStar785等使用 Overlay 是沒有問題的;但 SiRF A5、MStar 2521等低端的 CPU 則不支持。這兩種方案,基本上都是使用 Windows CE 系統(tǒng)提供的功能。接下來是,使用諸如 Open GL ES 做出的支持較好的動畫效果的 UI。最后,使用 Windows CE 新特性的?Silverlight 來實現(xiàn)的 UI 產(chǎn)品,現(xiàn)在也慢慢的出現(xiàn)在車載系統(tǒng)中。但使用 Silverlight 對系統(tǒng)的硬件配置要求比較高,現(xiàn)在也只出現(xiàn)在一些高端的產(chǎn)品中。?
接下來說說框架,在 Windows CE 下編程,怎么也逃脫不了 Windows 消息框架,至于是使用 MFC 還是使用 Win32 編程,那可以說是仁者見仁智者見智。但無論選用哪一種,它也只是一個基礎。UI 框架如何設計,功能如何與 UI 完美的結(jié)合,以達到修改 UI 時盡可能不去關(guān)心功能代碼?這也是 Silverlight 推出時的設計想法:UI 設計和實現(xiàn),與功能的實現(xiàn)分開。這種分開,個人認為簡單的說就是耦合度降到最低,不可能徹底分開的。UI 與功能之間一般通過消息、回調(diào)或定時等機制結(jié)合在一起。例如有一種使用定時刷新的?UI 方案,界面刷新的工作由一個獨立的線程控制,定時檢查各 UI 控件是否需要刷新、及如何刷新?功能模塊在功能實現(xiàn)時,只需要觸發(fā)控件的刷新標志即可。?
例如如下刷新線程與功能代碼:?
//?刷新線程代碼:?刷新各類型控件? while? {? ???//?字符串顯示控件? ???foreach(各個字符串控件)? ???{? ??????if(控件.bRefreshFlag)?//?如果控件的刷新標志? ??????{? ?????????控件.bRefreshFlag?=?FALSE;? ?????????//?刷新操作? ??????}? ???}? ???//?按鍵控件? ???foreach(各個按鍵控件)? ???{? ??????if(控件.bRefreshFlag)?//?如果控件的刷新標志? ??????{? ?????????控件.bRefreshFlag?=?FALSE;? ?????????//?刷新操作? ??????}? ???}? ???//?......?????????????????????//?其它類型控件? ????Sleep(50);? }? ? //?功能代碼? //?功能:?字符串顯示控件功能代碼? //?參數(shù)說明:??csStr?控件顯示的字符串;?bRefreshFlag?刷新控件標志? 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;?//?賦值刷新標志? ???}? }? //?功能:?按鍵控件功能功能代碼? //?參數(shù)說明:??bEnable?按鍵使能標志(對應顯示Enable/Disable圖片);?bSelect?按鍵按下或選中圖片;?bRefreshFlag?刷新標志? 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;?//?賦值刷新標志? ???}? ???if(bSelect?!=?bNewSelect)? ???{? ??????bSelect?=?bNewSelect;? ??????bRefreshFlag?=?TRUE;?//?賦值刷新標志? ???}? }
以上功能函數(shù)只是一個示例,例如:按鍵控件可能需要顯示字符串,其必然包含一個與字符串顯示類似的函數(shù)。各個控件都會有顯示/隱藏屬性,這個在功能代碼中也需要體現(xiàn)出現(xiàn)。為了方便控件布局,一般都會支持子窗口,這是一個多個功能的集合。?
如何使 UI 的設計具有簡單、方便的移植性?這是大家在設計時都會考慮的內(nèi)容。只所以這樣考慮,是想在功能不變、或簡單變化的情況下,能快速完成修改、且保證產(chǎn)品的穩(wěn)定性。特別是一些車載方案公司,對于一些要求不高的小客戶在快速確定?UI?后幾天就可以完成產(chǎn)品的交付。這種修改,一般包括換圖和圖片位置的調(diào)整。如何簡單有限的記錄圖片與圖片的位置等信息呢?早在幾年前,就有通過簡單的格式化文本來完成的方案。后來標記語言興起,在嵌入式方案中也得到廣泛應用,特別是?XML?語言。XML?語言的特點這里就不多說了,有興趣的童鞋在網(wǎng)絡上查找一下,就能得到答案。在這些方案中,都有用到圖片處理的技術(shù),以實現(xiàn)透明、半透明等效果。圖片一般采用?BMP?和?PNG?格式,為了方案的保密性等其它一些考慮,圖片一般通過工具打包,甚至于,XML?文件也一起打包。這樣在不了解打包后文件格式的情況下,客戶就必須依賴于軟件設計者。?
以上三部分結(jié)合在一起,就構(gòu)成了車載應用系統(tǒng)中單個應用軟件的框架:控件/子窗體/完整的界面。再給合一個對多個應用控制的邏輯,完成應用啟動/關(guān)閉(顯示/隱藏)等的控制,以完成一個完整的系統(tǒng)的設計實現(xiàn)。?