嵌入式用戶圖形接口uC/GUI在uC/OSII上的嵌入
◆ 子/父窗口
子窗口是相對于父窗口定義的窗口。無論何時,只要父窗口移動,則子窗口們都要相應(yīng)移動。子窗口被父窗口完全包含。擁有同一個父窗口的子窗口們互相間稱為兄弟。
◆ 客戶區(qū)
窗口的客戶區(qū)就是窗口的可用區(qū)。如果窗口包含方框或標題欄,則客戶區(qū)就是方框或標題欄的內(nèi)部區(qū)域。
◆ 句柄
當一個新的窗口被創(chuàng)建時,WM分配一個唯一的標識符,稱為句柄。句柄用在后續(xù)對該窗口操作的所有函數(shù)中,而且可以利用該句柄唯一標識該窗口。
◆ 有效窗口/無效窗口
有效窗口是一個已經(jīng)完全更新,不需要重繪的窗口。不管是完全重繪還是局部重繪。當窗口內(nèi)容發(fā)生改變時,WM則標識窗口無效。下一次重繪之后(調(diào)用回調(diào)函數(shù)),窗口又變?yōu)橛行А?p>4.3.2回調(diào)機制
uC/GUI提供給窗口和窗口控件的回調(diào)機制的背后,是一個事件驅(qū)動標志。在大多數(shù)的窗口系統(tǒng)中,流控不僅僅時從用戶程序到圖形系統(tǒng),而且還要能夠從用戶程序到圖形系統(tǒng),并且能夠通過用戶程序提供的回調(diào)函數(shù),返回到用戶程序。這個機制,就稱為回調(diào)機制。在uC/GUI中,回到機制用來在窗口管理中出控制窗口的重繪操作,這使得窗口管理的有效性成為可能。
4.3.3 回調(diào)函數(shù)的使用
使用回調(diào)函數(shù)建立一個窗口時,必須有一個回調(diào)函數(shù)。所用的回調(diào)函數(shù)必須有如下原型:
void callback (WM_MESSAGE *pMsg)。 其中pMsg為指向消息的指針。
回調(diào)函數(shù)執(zhí)行的功能依賴于所接收到的消息。以上原型后一般跟著switch表達式,表達式定義不同的case表達式下不同的信息對應(yīng)的不同行為,至少要有一個重繪函數(shù):WM_PAINT()。如程序清單4.1,建立一個自動更新窗口的回調(diào)函數(shù)
程序清單 4.1 建立一個自動更新窗口的回調(diào)函數(shù)
void WinHandler (WM_MESSAGE * pMsg)
{
switch (pMsg->MsgId)
{
case: WM_PAINT GUI_SetBkColor(0xff00);
GUI_Clear();
GUI_DispStringAt(“hello world”,0,0);
Break;
}
}
使用回調(diào)函數(shù),更為詳細的示例如程序清單4.2所示:
程序清單4.2 回調(diào)函數(shù)
#include GUI.H
/* 背景窗的回調(diào)函數(shù) */
static void cbBackgroundWin(WM_MESSAGE* pMsg)
{
switch (pMsg->MsgId)
{
case WM_PAINT: GUI_Clear();
default: WM_DefaultProc(pMsg);
}
}
/* 前景窗的回調(diào)函數(shù) */
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);
}
}
/* 回調(diào)機制 */
static void DemoRedraw(void)
{
GUI_HWIN hWnd;
while(1)
{
/*創(chuàng)建一個前景窗 */
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();
/* 設(shè)置背景窗的回調(diào)功能 */
WM_SetCallback(WM_HBKWIN, cbBackgroundWin);
/*創(chuàng)建一個前景窗 */
hWnd = WM_CreateWindow(10, 10, 100, 100,WM_CF_SHOW, cbForegroundWin, 0);
/* 顯示前景窗*/
GUI_Delay(1000);
/*刪除前景窗 */
WM_DeleteWindow(hWnd);
/* 等待,顯示將重繪*/
GUI_Delay(1000);
/* 刪除回調(diào)函數(shù) */
WM_SetCallback(WM_HBKWIN, 0);
}
}
void main(void)
{
GUI_Init();
DemoRedraw();
}
4.3.4 消息傳遞機制
程序清單4.2中,回調(diào)函數(shù)執(zhí)行的功能依賴于所接收到的消息。Switch語句中根據(jù)消息的類型,分別執(zhí)行不同的功能。
WM_MESSAGE的成員如下:
MsgId:消息類型
HWin: 目的窗口
HWinSrc: 源窗口
Data.p : 數(shù)據(jù)指針
Data.v: 數(shù)據(jù)值
其中MsgId的類型如下:
WM_PAINT: 窗口重繪
WM_CREATE: 窗口一建立就發(fā)送
WM_DELETE: 窗口一刪除就發(fā)送
WM_SIZE : 窗口尺寸發(fā)生改變就發(fā)送
WM_MOVE : 窗口移動就發(fā)送
WM_SHOW : 接收到show命令就發(fā)送
WM_HIDE : 接收到hide命令就發(fā)送
WM_TOUCH: 觸摸屏信息
應(yīng)用程序還可以為自己定義額外的消息。為保證它們不用到uC/GUI的消息ID,用戶定義的消息從WM_USER后面開始,如:
#define MY_MESSAGE_AAA WM_USER +0
#define MY_MESSAGE_BBB WM_USER +1
評論