ucGUI390 觸控訊息響應過程

2021-04-12 14:30:11 字數 4690 閱讀 6440

ucgui390觸控訊息響應過程

by nathan.yu 

2006-12-11

觸筆觸摸螢幕-

>

產生中斷-

>

中斷處理獲得觸控物理座標-

>

其後(仍在中斷處理函式中)的處理過程:

gui_touch_exec

->gui_touch_storeunstable(x, y)

->

gui_touch_storestate(x, y)

在此函式中,改寫區域性靜態變數

static gui_pid_state _state

如下:

if ((x >= 0) && (y >= 0)) else -

>

gui_touch_storestateex(&_state)

,做如下事:

if (memcmp(pstate, &_state, sizeof(_state))) -

>

void gui_pid_storestate(const gui_pid_state *pstate) }

->

static void _pid_load(void) -

>

中斷返回-

>

進入以下函式,迴圈執行:

gui_exec()

->gui_exec1()

->wm_exec()

->wm_exec1()

-> 在

wm_exec1()

函式中做如下判斷:

if (wm_pfhandlepid)

讓我們分析函式wm_handlepid:(位於

wmtouch.c中)

1)gui_pid_getstate(&statenew);//

獲得剛剛觸控的狀態 2

)chwin.hwin = _screen2win(&statenew);//

判斷被觸控的是哪個東東!具體如下:

static wm_hwin _screen2win(gui_pid_state* pstate)

return wm__hcapture; }

->

wm_hwin wm_screen2hwin(int x, int y) -

>

static wm_hwin _screen2hwin(wm_hwin hwin, wm_hwin hstop, int x, int y)

/* if the coordinates are in a child, search deeper ... */

for (hchild = pwin->hfirstchild; hchild && (hchild != hstop); )

hchild = pchild->hnext; }

return hwin;           /* no child affected ... the parent is the right one */

}3) wm__isinmodalarea(chwin.hwin)//

判斷是否模態? 是:

看狀態是否改變,

if ((wm_pid__statelast.pressed != statenew.pressed) && chwin.hwin) 是:

msg.msgid  =wm_pid_state_changed;

wm__sendmessageifenabled(chwin.hwin, &msg);

以按鈕為例,這時按鈕的預設**函式:

button_callback

就會收到這個訊息

並呼叫widget_handleactive(hobj, pmsg)

,在此函式中有如下**:

casewm_pid_state_changed:

if (pwidget->state &widget_state_focussable) }

返回到wm_handlepid接下來處理觸控事件:

msg.msgid =wm_touch;

其中包括按下和提起兩個觸控事件,首先判斷上次觸控的窗體和這次是否是同乙個,如果不是,則先傳送wm_touch訊息給上次觸控的窗體:

if (statenew.pressed)             

wm__sendtouchmessage(wm__chwinlast.hwin, &msg);

wm__chwinlast.hwin = 0; 在

wm__sendtouchmessage

函式中,還會把這個訊息傳送給上次觸控的窗體的所有父窗體呢!你看:

void

wm__sendpidmessage(wm_hwin hwin, wm_message* pmsg)

}}假設上次觸控的窗體也是乙個按鈕,則,這時

button_callback

就會收到這個訊息:

casewm_touch:

_ontouch(hobj, pobj, pmsg);

_ontouch

函式如下:

static void _ontouch

(button_handle hobj, button_obj* pobj, wm_message*pmsg

)#else

if (pstate->pressed)

} else }

}else

#endif

其中_buttonreleased函式如下:

static void _buttonreleased(button_handle hobj, button_obj* pobj, int notification)

if (notification == wm_notification_released)

} 由於呼叫了wm_notifyparent函式,因此按鈕的父窗體就會收到wm_notification_moved_out這個訊息,我們假設其父是個framewin_obj

則framewin_obj

的**函式framewin__cbclient以及使用者自定義**函式會處理這個訊息。為什麼會是這樣,因為,對乙個對話方塊,其結構如下:

再次返回到wm_handlepid接下來向本次觸控的窗體傳送wm_touch訊息。

首先,如果是按下,則儲存窗體控制代碼wm__chwinlast.hwin = chwin.hwin;然後傳送訊息:

msg.data.p = (void*)&statenew;

wm__sendtouchmessage (chwin.hwin, &msg);

按照上面的分析,一直呼叫,再次進入

button.c

中的_ontouch函式:

此時,pmsg->data.p!=

null因此執行如下操作:

if (pstate->pressed)

} else

} }

static void _buttonpressed (button_handle hobj, button_obj* pobj)

} 此時,我們就可以在應用程式自定義的**函式中處理按鈕的按下和提起事件了。例如:

casewm_notify_parent:

id    = wm_getid(pmsg->hwinsrc);    /* id of widget */

ncode = pmsg->data.v;               /* notification code */

switch (ncode)

if (id == gui_id_cancel)

break;

} break;

......................

今天就先分析到這裡吧!

ucgui移植記錄

196568501 qq 最近移植了ucgui 想把他寫下來跟正在關注ucgui的人一起 和學習,初次寫東西還希望大俠們多多指教。移植分為主要的三步 第一步 第二步 找到最底層函式,跟你的液晶驅動器對接。第三步 測試你一直的gui功能。編譯ucgui 第一步詳解 編譯器 vitual dsp 4.5...

uc gui重繪機制

乙個控制項根據它的特性繪製自己。這一工作通過呼叫wm的 api函式 wm exec 來完成。如果在程式中沒有呼叫 wm exec 就必須呼叫 wm paint 函式來繪製控制項。在多工環境的 uc gui 乙個後台任務通常用於呼叫 wm exec 並更新控制項 及其它所有帶有 函式的視窗 這樣就不必...

UCGUI論壇的目標隨想

嵌入式作業系統及圖形系統學習研究 建站心路與學習筆記 ucgui論壇的目標隨想.ucgui論壇的目標隨想.論壇的總體目標與計畫 論壇建立的目標就是為了學習嵌入式圖形系統與作業系統,從而推出自己的嵌入式圖形系統與作業系統 這是最大的目標.顯然,這個目標非常的不容易,也許是一年,也許是兩年,但最重要的不...