利用μC/GUI實現(xiàn)無紙記錄儀界面
引 言
無紙記錄儀記錄采樣得到的數(shù)據(jù),并根據(jù)用戶選擇的配置顯示出用戶需要的時問段的數(shù)據(jù)。該記錄儀實現(xiàn)無筆、無紙記錄,日常維護工作小??赏瑫r輸入多種信號,互不干涉,實時顯示,可靠性好,應(yīng)用靈活。
對無紙記錄儀界面要求是:顯示信息量大,方便用戶查找所需要的信息;操作簡單,界面友好,使用戶不必進行專業(yè)培訓(xùn)即可操作。
lμC/GUI
1.1 μC/GuI簡介
μc/GUI是美國Micrium公司出品的一款針對嵌入式系統(tǒng)的優(yōu)秀圖形軟件。它是為任何使用LcD(液晶顯示器)圖形顯示的應(yīng)用提供高效的、獨立于處理器及LcD控制器而設(shè)計的GuI(圖形用戶接口),適用于單任務(wù)或多任務(wù)系統(tǒng)環(huán)境。其主要特性是:豐富的圖形庫,多窗口、多任務(wù)機制,窗口管理及豐富窗口控件類(按鈕、檢驗框、單/多行編輯框、列表框、進度條、菜單等),多字符集和多字體支持,多種常見圖像文件支持,鼠標(biāo)、觸摸屏支持,靈活自由配制等。
1.2 μC/GuI文件組織
μC/GUI文件結(jié)構(gòu)見圖l。
μC/CUl\GuI\Ant認(rèn)lias:處理顯示的邊緣模糊效果,即抗鋸齒和優(yōu)化LCD鋸齒。
μC/CuI\GUI\ConvertColor:涉及調(diào)色板模式。μC\GuI的調(diào)色板模式支持111、222、223、323、332、444、555、565、8666等相關(guān)模式。
μc/GuI\GuI\ConvertMono:描述單色顯示的不同模式。
μC/GUI\GUI\Core:是μC/GUI的核心部分,包括GUI頭文件、GUI顯示各種文本和數(shù)字、設(shè)置各種字體、2一D圖形庫、繪圖函數(shù)、鍵盤函數(shù)等。
μC/GUI\GUI\Font:μC/GUl支持的字體。
μC/GUI\GUI\LCDDriver:很多已經(jīng)完備的LCD控制器的驅(qū)動程序以及API函數(shù)。
tAC/GUI\GUI\MemDev:MemDev的所有函數(shù)。txC/GUI函數(shù)繪圖不使用MemDev時,畫圖操作直接寫到終端上顯示,交迭繪圖執(zhí)行時刷新屏幕,多次刷新時就會出現(xiàn)抖動。如果在程序中使用MemDev,則所有的執(zhí)行操作都在MemDev中執(zhí)行,當(dāng)所有的操作都執(zhí)行完畢之后,最后的結(jié)果才會送到屏幕上顯示,因而可以避免多次刷新,從而避免抖動。
μC/GUI\GUI\Touch:觸摸屏驅(qū)動函數(shù)。
μC/GUI\GUI\Widget:窗口控件函數(shù)。
μC/GUI\GUI\WM:窗口管理函數(shù)。
1.3 μC/GUI與其他圖形系統(tǒng)的比較
a)μC/GUI優(yōu)勢在于體積小,配制性強,運用領(lǐng)域廣泛。只要滿足RAM 1 00 B,堆棧5 0 0 B,ROM10 kB的小型系統(tǒng)中都可以運行μC/GUI,而這個需求是其他圖形系統(tǒng)所不及的。在資源豐富的大型系統(tǒng)中,也只需要RAM 2 kB~6 kB,堆棧1 2 00 B,ROM30kB一60kB就可以滿足μC/GUI的各種功能。對比于其他圖形系統(tǒng)最少幾百kB,動輒上MB的系統(tǒng)而言是非常有優(yōu)勢的。其眾多的配制,滿足不同需求用戶需要,方便靈活小巧,實用性大大增強。
b)平臺的廣泛性,移植方便。由于μc/GuI是100%C編寫,適應(yīng)絕大多數(shù)軟硬平臺,相對于眾多具有軟硬件針對性的圖形系統(tǒng)而言,結(jié)構(gòu)劃分和模塊劃分非常清晰,分設(shè)專門的LCD驅(qū)動模塊,移植簡單方便。代碼量相對較小,易操作,可擴展性強,方便用戶定制和自主更新完善,滿足個性需求。
2工程項目分析
本文主要實現(xiàn)無紙記錄儀的界面。項目中利用μC/GUI的消息傳遞機制來實現(xiàn)各控件之間的聯(lián)系及功能,使用回調(diào)函數(shù)進行各界面之間的切換。
2.1消息機制
μC/GuI是采用消息驅(qū)動的,它專門有對外的一套收集消息的接口。
一些基本的消息如下:
wM-CREATE:窗體創(chuàng)建消息,每創(chuàng)建一個窗體完后都會向該窗體發(fā)送此消息。
wM-SHOW:顯示窗體消息,此消息在μC/GUI中各控件窗體內(nèi)均未作處理。要顯示窗體一般使用wM-ShowWindow函數(shù)。
WM-PAINT:窗體重畫消息,當(dāng)窗體所在區(qū)域全部或部分無效時,系統(tǒng)會發(fā)出該消息,將無效區(qū)域重畫,μC/GUI中是將全部區(qū)域重畫;當(dāng)由外部輸人操作引起無效區(qū)域產(chǎn)生時,系統(tǒng)會在消息處理中發(fā)送該消息到窗體消息回調(diào)函數(shù)中,以重畫此窗體。
WM-KEY:處理按鍵式操作的輸入外設(shè)的消息,消息中必須包含按鍵的按下或彈起狀態(tài),此消息在任務(wù)消息循環(huán)中循環(huán)處理,一旦產(chǎn)生就會發(fā)送給當(dāng)前焦點窗體。
wM-SET_FOCUS:所有外部輸入設(shè)備消息都是發(fā)送給當(dāng)前焦點窗體的,用戶可以通過此消息來設(shè)定當(dāng)前的焦點窗體。
WM-NOTIFY-PARENT:此消息將子窗體的外設(shè)輸入消息傳送到它的父窗體,因為一般情況下消息都是在父窗體中統(tǒng)一處理,如對話框中的按鈕點擊事件,一般在用戶自定義的窗體消息處理函數(shù)中處理,所以必須要子窗體將獲取的輸入外設(shè)的消息傳送給父窗體,這樣才能在父窗體中進行子窗體的點擊事件消息的處理,處理該消息時通過控件ID來區(qū)別不同的控件,通過消息中的通知碼來區(qū)別控件被操作的各種狀態(tài)。
wM_DELETE:要刪除窗體時發(fā)送的消息,主要清除窗體數(shù)據(jù)結(jié)構(gòu)所占用內(nèi)存,此消息由WM-DeleteWindow函數(shù)發(fā)送。
WIDGET_HandleActive:基礎(chǔ)控件共通消息處理,大部分μC/GUI控件中都會在消息回調(diào)函數(shù)的頭部進行這個調(diào)用,處理了消息后,就直接退出消息回調(diào)函數(shù)的調(diào)用。這個函數(shù)中處理如下消息:
WM-GET-ID:返回窗體控件標(biāo)志ID。
WM-SET-FOCUS:設(shè)置當(dāng)前窗體為焦點窗體,設(shè)置完后還必須向該窗體的父窗體發(fā)送WM-NOTIFY-CHILD-HAS-FOCUS消息,讓其父窗體更新它記載的當(dāng)前焦點子窗體。WM-GET-HAS-FOCUS:獲取當(dāng)前窗體是否為焦點窗體。
WM-SET-ENABLE:設(shè)置窗體為不可用窗體。
WM-GET-ACCEPT-FOCUS:獲取當(dāng)前窗體是否可設(shè)置為焦點窗體。 WM-GET-INSIDE-RECT:返回窗體內(nèi)框矩形。
WM-DefauhProc:窗體默認(rèn)消息處理函數(shù),μC/GUI中提供一些基礎(chǔ)的控件,這些控件有些共通的消息均在此處理,如下:
WM-GETCLIENTRECT:獲取窗體矩形區(qū)域,相對于矩形自身。
WM-GETORG:獲取窗體矩形左上角坐標(biāo)。
WM-GET-INSIDE-RECT:獲取窗體矩形區(qū)域,相劉屏幕。
WM-GET-CLIENT-WINDOW:獲取窗體客戶區(qū)子窗體句柄。
下面以項目中按下OK按鈕事件為例來簡單說明消息傳遞機制(見圖2)。
按下OK按鈕,隨后產(chǎn)生按鈕WM-TOUCH消息。消息LOOP調(diào)用按鈕默認(rèn)的按鈕窗口消息處理函數(shù)一BUTYON-Callback。一OnTouch默認(rèn)處理按鈕按下事件并發(fā)送給父窗體WM-NOTIFY-PARENT消息,這種情況下,消息中還有一個通知碼WM-NOTIFICATION-REI_EASED。默認(rèn)的對話框窗體消息處理函數(shù)一FRAMEWIN-Callback收至 WM-NOTIFY-PARENT消息并最終傳送該消息到自己定義的對話框消息處理函數(shù)。由一FRAMEWIN-Callback傳送的消息首先傳送到對話框的默認(rèn)窗體消息回調(diào)函數(shù)一CbDialog,然后再經(jīng)它傳送到用戶自定義的窗體回調(diào)函數(shù)當(dāng)中。在自己的對話框消息處理函數(shù)中處理wM-NOTIFY-PARENT消息,該消息參數(shù)中含有按鈕的ID及操作狀態(tài),如果通知碼是WM-NOTIFICATION-RELELASED,此時證明一次按下按鈕事件完成。
再來分析一下對話框外面的消息接收:GUI-Exec-DialogBox函數(shù)有幾個參數(shù):第1個是對話框的資源定義數(shù)組,這個數(shù)組定義了對話框的組成子窗體,其中數(shù)組第1個成員必須是FrameWin窗體,數(shù)組每1個成員記載了創(chuàng)建子窗體所用函數(shù)/子窗體Caption/子窗體標(biāo)志:ID/子窗體的位置及寬高/創(chuàng)建窗體時樣式標(biāo)志/額外傳送的參數(shù)。第2個參數(shù)是上述的數(shù)組的大小。第3個參數(shù)是用戶指定的對話框窗體消息回調(diào)函數(shù)指針。第4個參數(shù)是對話框的父窗體,默認(rèn)為0。第5、第6參數(shù)指定對話框的左上角屏幕位置。
GUI-ExecDialogBox主要完成如下工作:
a)根據(jù)傳進來的對話框資源定義數(shù)組創(chuàng)建對話框及對話框中的子窗體。
b)根據(jù)傳進來的窗口消息處理函數(shù),記載到一全局變量保存,當(dāng)這個全局變量中記載的函數(shù)指針為非空時,執(zhí)行消息LOOP,消息LOOP中會將當(dāng)前KEY消息發(fā)送給當(dāng)前焦點窗體。
評論