由于使用vs2005,很容易通过callstack查到ucgui的传递过程,但是用vs2005的时候,由于原先的GUI_sim.lib用到了libc.lib,所以在工程配置里面要在输入ignore librarys里面将libcmt.lib改成libc.lib
(1)keymessage 的传递
线程1:
在GUI_ExecCreatedDialog创建Dialog后,执行->
while (!DialogStatus.Done) {
if (!GUI_Exec()) {
GUI_X_WAIT_EVENT(); /* Wait for event (keyboard, mouse or whatever) */
}
}
等待GUI_X_WAIT_EVENT得到消息
此时线程可以挂起(在ucosii中使用OSFlagPend),在WinMain中Sleep(10)
线程2:
在WinMain中注册一个callback
static LRESULT CALLBACK _WndProcDevice(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
当发生key事件时,系统通过这个callback截获keymessage传递给
GUI_StoreKeyMsg(Key, 1);
这时线程1就得到了key的消息,在ucosii中通过相同的方式就可以实现keymessage
的传递了
(2)Touch, Mouse message的传递
线程1:
与keymessage消息一样
Touch和mouse的事件有点不太一样,但基本上是一样的
就是touch没有move消息,而mouse有
线程2:
在WinMain中通过注册
static LRESULT CALLBACK _WndProcLCD(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
来获得系统Mouse message
当有mouse消息时,就有三种类型的消息会被截获
case WM_LBUTTONUP:
case WM_LBUTTONDOWN:
case WM_MOUSEMOVE:
callstack:
Simulation.exe!_WndProcLCD(HWND__ * hWnd=0x00010f06, unsigned int message=512, unsigned int wParam=0, long lParam=327894) Line 939 + 0x11 bytes C
Simulation.exe!LCDSIM_SetMouseState(int x=214, int y=5, int KeyStat=0) Line 591 C
Simulation.exe!LCDSIM_CheckMouseState() Line 580 C
> Simulation.exe!_NotifyMouseState() Line 133 C
这样就把消息发送到了线程1
实现了消息的传递
(3)消息传递给谁,由谁来处理呢
传递了消息以后,一般由控件直接处理了,如果有控件事情就比较好办了,因为控件都有focus
可以用,如果在程序里面没有控件,那就得注册一个窗口callback来处理相应
的事件
WM_SetCallback(WM_HBKWIN, _cbBkWindow);
就是起的这个作用的,这个callback要自己来写,值得注意的是
WM_HBKWIN handle本身就有许多其它的message需要处理,所以要用到switch-case
结构
|
|