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