軟體簡介
它能夠套用於單一任務環境,也能夠套用於多任務環境中。uC/GUI能夠套用於任何LCD控制器和CPU的任何尺寸的物理顯示或模擬顯示中。
軟體特點
適用於任何8位/16位/32位CPU,可允許於支持ANSI C的任何編譯器適用於任何控制器驅動任何LCD(單色,灰度,或彩色)通過配置宏,可支持任何接口可配置顯示尺寸可在LCD的任何一點上顯示字元和畫點陣圖對於顯示尺寸和速度提供最佳化進程,編譯時間依賴於採用的最佳化進程支持虛擬顯示,虛擬顯示的尺寸比實際顯示大。
文檔組織
uC/GUI目錄下的文檔有配置文檔目錄Config,GUI庫函式目錄,連同為GUI編寫的應用程式目錄。下面分別簡要介紹相應目錄下的函式,更為周詳的文檔介紹請參考我的uC/GUI移植的原始碼。
uC/GUI\Config\目錄:
GUICONF.h:配置GUI移植到不同作業系統的選項。在本論文中配置移植到uC/OSII中,允許多任務調用uC/GUI函式。
GUITouchConf.h:配置觸控螢幕的選項連同編寫觸控螢幕的驅動。本文移植uC/GUI所使用的LCD屏不支持觸控螢幕,所以此文檔為空。
LCD_Init.C: LCD控制器的初始化文檔。
LCD_Conf.h: LCD顯示屏的選項文檔,包括bpp,調試板模式,水平、豎直方向的解析度等等。
uC/GUI\GUI\AntiAlias\目錄:這個目錄中包含9個文檔,處理顯示的邊緣模糊效果,也就是抗鋸齒和最佳化LCD鋸齒。液晶屏上畫斜線往往都有鋸齒,所以通過最佳化算法進行美化。
uC/GUI\GUI\ConvertColor\目錄:這個目錄中包含14個.C文檔,涉及調色板模式。uC\GUI的調色板模式支持111模式,222模式,223,323,332,444,555,565,8666等相關模式。我在論文中使用的LCD屏,為單色16級灰度屏,因而不涉及到這些模式。但為了保持UC\GUI文檔的完整性,該目錄連同目錄下14個文檔,仍然保存在移植文檔中。
uC/GUI\GUI\ConvertMono\目錄:此目錄下的文檔描述單色顯示的不同模式,包含4個文檔。
uC/GUI\GUI\Core:此目錄下包含129個文檔,是uC/GUI的核心部分。包括GUI頭文檔,GUI顯示各種文本,二進制,十進制,十六進制,字元型文本,字元串,在不同的位置顯示二進制,十進制,十六進制,字元型文本,字元串等;GUI配置各種字型;GUI的2-D圖像庫,GUI繪圖函式,在各種位置繪各種點,線,點陣圖,多邊形,長方形,圓等等;GUI獲取函式,獲取當前點,線,點陣圖,多邊形,長方形,圓,當前字型,當前二進制,十進制,十六進制,字元型文本,字元串等函式;配置GUI畫筆函式;GUI支持的滑鼠函式;GUI支持的鍵盤函式,GUI支持的觸控螢幕函式;GUI配置LCD函式等等。這些函式,在uC/GUI系統中都是必須的函式。正是這些函式的組合,使得uC/GUI具備複雜而且完備的圖像用戶接口。而且,這些函式的組合,使得uC/GUI能夠單獨的使用,也能夠通過配置文檔,移植到各種作業系統中使用。
uC/GUI\GUI\Font:此目錄下包含的是uC/GUI支持的字型。
uC/GUI\GUI\LCDDriver:LCDAPI目錄。該目錄下包含很多已完備的LCD控制器的驅動程式連同API函式。
uC/GUI\GUI\MemDev:MemDev目錄。MemDev主要用於防止在畫交迭圖時產生的抖動。uC/GUI函式繪圖不使用MemDev時,畫圖操作直接寫到終端上顯示,交迭繪圖執行時刷新螢幕,多次刷新時就會出現抖動。例如,要在背景色中畫圖,且在前景中寫一些透明的文字,實現的步驟就是先畫圖,然後寫文字,那么結果就會出現文字的抖動。假如在程式中使用MemDev,則任何的執行操作都在MemDev中執行,當任何的操作都執行完畢之後,最後的結果才會送到螢幕上顯示,因而能夠避免多次刷新,從而避免抖動。此目錄下包含這MemDev的任何函式,包括創建MemDev函式,激活MemDev,執行畫圖操作,顯示到終端,刪除MemDev函式等等。
uC/GUI\GUI\Touch:觸控螢幕驅動函式所在目錄。uC/GUI只支持模擬的觸控螢幕。因而此目錄下只包含模擬觸控螢幕。
uC/GUI\GUI\Widget:此目錄包含視窗控制項函式,總共46個函式。UC/GUI中視窗控制項機制時uC/GUI的實現難點,也是套用難點。運用視窗管理和回調機制,運用視窗控制項函式,能夠任意在LCD螢幕上實現類似於windows的界面,這樣完備的功能在工業自動化控制和觸控螢幕套用上有著深遠而積極的意義。此目錄下的函式主要包括uC/GUI的視窗控制項,如按鈕BUTTON,校驗窗CHECKBOX,編輯區EDIT,視窗框FRAMEWIN,列表LISTBOX,進度條PROGBAR,音頻按鈕RADIOBUTTON,滾動條SCROLLERBAR,改變值的灰度條SLIDER,連同文本框TEXT相關的各種函式。
uC/GUI\GUI\WM:此目錄包括視窗管理函式,總共52個函式。UC/GUI中,視窗管理中的訊息傳遞機制和回調機制,也是uC/GUI的實現難點和套用難點。4.3節中將周詳介紹這兩點。此目錄下的函式主要包括配置、返回、建立背景視窗、父視窗、各種子視窗連同相應的尺寸、視窗句柄,起點x,y坐標,視窗寬度,高度,位置等等,還包括改變視窗的大小,連同最關鍵的視窗的回調函式,視窗重繪函式等等。
視窗管理
4.3.1簡介
uC/GUI的視窗管理是個單獨的軟體,不是uC/GUI的基本組成部分。周詳代碼見\uCGUI\GUI\WM。
當使用uC/GUI視窗管理時,任何能顯示在顯示終端上的內容都包含在一個視窗裡面,這個視窗是LCD螢幕上的一個給用戶畫圖或顯示目標的區域。視窗能夠是任何尺寸的,能夠一次在螢幕上顯示多個視窗,也能夠在其他視窗當中或之前顯示視窗。
視窗管理的幾個名詞:
活動視窗:
當前正在用來畫圖或是顯示操作的視窗。
回調函式:
回調函式是由用戶定義的,當特定事件發生時,指示圖像系統調用特定函式的函式。通常當視窗的內容發生改變時,他們用來自動重繪視窗。例如,視窗內顯示一幅點陣圖,當視窗移動時,點陣圖並不會自動移動,此時,就需要調用回調函式對視窗進行重繪,即,從觀眾的角度來看,移動視窗和視窗內容。
子/父視窗:
子視窗是相對於父視窗定義的視窗。無論何時,只要父視窗移動,則子視窗們都要相應移動。子視窗被父視窗完全包含。擁有同一個父視窗的子視窗們互相間稱為兄弟。客戶區視窗的客戶區就是視窗的可用區。假如視窗包含方框或標題欄,則客戶區就是方框或標題欄的內部區域。
句柄:
當一個新的視窗被創建時,WM分配一個唯一的標識符,稱為句柄。句柄用在後續對該視窗操作的任何函式中,而且能夠利用該句柄唯一標識該視窗。
有效視窗/無效視窗:
有效視窗是個已完全更新,無需重繪的視窗。不管是完全重繪還是局部重繪。當視窗內容發生改變時,WM則標識視窗無效。下一次重繪之後(調用回調函式),視窗又變為有效。
4.3.2回調機制
uC/GUI提供給視窗和視窗控制項的回調機制的背後,是一
個事件驅動標誌。在大多數的視窗系統中,流控不但僅時從用戶程式到圖像系統,而且還要能夠從用戶程式到圖像系統,並且能夠通過用戶程式提供的回調函式,返
回到用戶程式。這個機制,就稱為回調機制。在uC/GUI中,回到機制用來在視窗管理中出控制視窗的重繪操作,這使得視窗管理的有效性成為可能。
4.3.3回調函式的使用
使用回調函式建立一個視窗時,必須有一個回調函式。所用的回調函式必須有如下原型:
void callback (WM_MESSAGE *pMsg)。其中pMsg為指向訊息的指針。
回調函式執行的功能依賴於所接收到的訊息。以上原型後一般跟著switch表達式,表達式定義不同的case表達式下不同的信息對應的不同行為,至少要有一個重繪函式:WM_PAINT()。如程式清單4.1,建立一個自動更新視窗的回調函式
程式清單 4.1 建立一個自動更新視窗的回調函式
void WinHandler (WM_MESSAGE * pMsg)
{
switch (pMsg->MsgId)
{
case: WM_PAINT GUI_SetBkColor(0xff00);
GUI_Clear();
GUI_DispStringAt(“hello world”,0,0);
Break;
}
}
使用回調函式,更為周詳的示例如程式清單4.2所示:
程式清單4.2 回調函式
#include "GUI.H"
/* 背景窗的回調函式*/
static void cbBackgroundWin(WM_MESSAGE* pMsg)
{
switch (pMsg->MsgId)
{
case WM_PAINT: GUI_Clear();
default: WM_DefaultProc(pMsg);
}
}
/* 前景窗的回調函式*/
static void cbForegroundWin(WM_MESSAGE* pMsg)
{
switch (pMsg->MsgId)
{
case WM_PAINT: GUI_SetBkColor(GUI_GREEN);
GUI_Clear();
GUI_DispString("Foreground window");
default: WM_DefaultProc(pMsg);
}
}
/* 回調機制 */
static void DemoRedraw(void)
{
GUI_HWIN hWnd;
while(1)
{
/*創建一個前景窗 */
hWnd = WM_CreateWindow(10, 10, 100, 100, WM_CF_SHOW, cbForegroundWin, 0);
/*顯示前景窗*/
GUI_Delay(1000);
/* 刪除前景窗 */
WM_DeleteWindow(hWnd);
GUI_DispStringAt("Background of window has not been redrawn",10, 10);
/* 等待,顯示並不重繪 */
GUI_Delay(1000);
GUI_Clear();
/* 配置背景窗的回調功能 */
WM_SetCallback(WM_HBKWIN, cbBackgroundWin);
/*創建一個前景窗 */
hWnd = WM_CreateWindow(10, 10, 100, 100,WM_CF_SHOW, cbForegroundWin, 0);
/* 顯示前景窗*/
GUI_Delay(1000);
/*刪除前景窗 */
WM_DeleteWindow(hWnd);
/* 等待,顯示將重繪*/
GUI_Delay(1000);
/* 刪除回調函式*/
WM_SetCallback(WM_HBKWIN, 0);
}
}
void main(void)
{
GUI_Init();
DemoRedraw();
}
4.3.4 訊息傳遞機制
程式清單4.2中,回調函式執行的功能依賴於所接收到的訊息。Switch語句中根據訊息的類型,分別執行不同的功能。
WM_MESSAGE的成員如下:
MsgId:訊息類型
HWin: 目的視窗
HWinSrc: 源視窗
Data.p : 數據指針
Data.v: 數據值
其中MsgId的類型如下:
WM_PAINT: 視窗重繪
WM_CREATE: 視窗一建立就傳送
WM_DELETE: 視窗一刪除就傳送
WM_SIZE : 視窗尺寸發生改變就傳送
WM_MOVE : 視窗移動就傳送
WM_SHOW : 接收到show命令就傳送
WM_HIDE : 接收到hide命令就傳送
WM_TOUCH: 觸控螢幕信息
應用程式還能夠為自己定義額外的訊息。為確保他們不用到uC/GUI的訊息ID,用戶定義的訊息從WM_USER後面開始,如:
#define MY_MESSAGE_AAA WM_USER +0
#defineMY_MESSAGE_BBB WM_USER +1