UCGUI 消息机制实现分析

来源:互联网 发布:网络维护外包 编辑:程序博客网 时间:2024/05/29 06:48


Ucgui的消息机制类似于WIN32的消息循环机制,但Ucgui的消息机制简单于WIN32,WIN32更简单的消息处理机制,在WIN32中主要是通过消息队列来实现对消息的派发,同时也要考虑消息的派发的同步和异步。而Ucgui的消息机制则是通过两个变量的记录来实现。(必须先了解ucgui的内存分配,ucgui WM_OBJ结构h2p

 

 

 

 

 

 

首先,我们通过Ucgui里面提供的DIALOG_All的示例程序来解读其消息机制。跑进其主函数

可以看到程序先初始化了ucgui所需环境,然后执行了DialogBox,而消息机制的运行就在这个函数内开始。其内部实现如下:

在里面先创建了一个DialogBox,因为他是主窗口,所以利用起回调函数指针的情况,来控制其整个DialogBox里面的消息循环。

接着,看看GUI_Exec,消息机制真正开始的地方。

从图片可以看出,在GUI_Exec开始了循环,而真正派发消息的是在GUI_Exec1里面,

GUI_Exec1除了派发消息,同时还执行Timer的触发。

在这里我们只看消息的派发,UCGUI是如何管理起消息的,WM_Exec()如下

注意:到这里,已经有三个循环了,在为执行完时,是不会执行到下一个步骤的

在上图中,我们主要看GUI_PollKeyMsg()函数和_DrawNext()函数,GUI_PollKeyMsg()函数主要处理了消息派发,而_DrawNext()则是处理WM_PAINT

GUI_PollKeyMsg()如下图

 

_KeyMsgucgui初始化时,就初始为用于记录RxMsg状态的全局变量,然后根据_KeyMsgCnt0,或者非0,通过WM_OnKey函数派发消息到当前聚焦的窗口。

_DrawNext函数主要用于当前窗口的WM_PAINT消息响应

对于其他消息的响应,可以通过WM_SendMessage函数发送到响应的窗口,而这个函数主要也是取出那个窗口的句柄,执行窗口回调函数。

 

 

 

0 0