首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ucgui 输入消息传递过程

ucgui 输入消息传递过程

ucgui 输入消息传递过程

[hide][/hide]

由于使用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
结构

细节决定成败!
返回列表