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()如下图
_KeyMsg在ucgui初始化时,就初始为用于记录Rx的Msg状态的全局变量,然后根据_KeyMsgCnt为0,或者非0,通过WM_OnKey函数派发消息到当前聚焦的窗口。
而_DrawNext函数主要用于当前窗口的WM_PAINT消息响应
对于其他消息的响应,可以通过WM_SendMessage函数发送到响应的窗口,而这个函数主要也是取出那个窗口的句柄,执行窗口回调函数。