今天主要查看HWND_DESKTOP相关的一些内容。
1. HWND_DESKTOP的创建:MiniGUIMain其实是MINIGUI的一个宏,参见Minigui.h的1171行,如下所示:
由此可见,其实Minigui程序的真正入口为main_entry函数,在这个函数中首先调用了InitGUI函数,这个函数定义在Init.c中的353行,这个函数的作用是做MiniGUI的一些初始化操作,具体操作的内容和意义现在还不甚了解,现在只知道其中一步是初始化HWND_DESKTOP,“桌面”句柄便是自此而来。
2. HWND_DESKTOP存在的意义:类似于一个工作流引擎/状态机。HWND_DESKTOP初始化的代码参见Desktop-comm.c的20行,如下所示:
由这个初始化函数可以大概看出几点:
a) HWND_DESKTOP的创建其实和我们所创建的window差不多,也有自己的消息处理函数和其它参数;
b) HWND_DESKTOP有自己的消息队列(至少),至于这个消息队列是属于他独自享用,还是和整个MiniGUI程序共用,现在还不能确定;
c) 通过跟踪其消息处理函数,暂时了解到HWND_DESKTOP功用如下:
i. 负责消息的转发。例如MSG_CHAR,就是通过HWND_DESKTOP转发给当前活动窗口的。ps:由此来看的话,是否MiniGUI程序只有一个消息队列,即HWND_DESKTOP的消息队列,所有消息均递交给HWND_DESKTOP,然后再由HWND_DESKTOP进行分发?现在还不确定,有待考证。
ii. 对于每个Window,均含有一个寄宿链表和宿主句柄,所有寄宿于当前Window的窗体句柄均会以链表节点的形式被记录下来,而这个链表的维护既是由HWND_DESKTOP来负责的;
iii. 有一个名为__mg_active_mainwnd的句柄,其中记录了当前活动窗体,关于当前活动窗体的访问和设置,其实都可以归结为__mg_active_mainwnd的操作,例如GetActiveWindow函数,就是发送了MSG_GETACTIVEMAIN给HWND_DESKTOP,然后由HWND_DESKTOP将__mg_active_mainwnd返回,当然了,__mg_active_mainwnd的维护操作也是由__mg_active_mainwnd来进行。