minigui控件管理这几篇文章重点在于说明控件类数据结构和控件数据结构的管理,并找出控件类与控件在代码上的联系与区别。
1、 系统注册
Minigui在初始化期间,会有一个控件类初始化,该函数在src/gui/ctrlclass.c
在这里根据配置,注册了一系列的控件。在此我们看一下关于编辑框的注册。如果定义了_CTRL_SLEDIT这个宏,就去会调用RegisterSLEditControl这个函数。该函数位于src/control/edit.c
在注册编辑框的开始,首先会初始化一个WNDCLASS类型的窗口类,它的定义在include/window.h
这里对这个类做了简单的初始化,比如类名、回调函数等。这是所有编辑框共同具有的特征属性。这些初始化好之后,就调用AddNewControlClass来添加一个控件类。该函数位于src/gui/ctrlclass.c
从这段代码可以看出,这里主要是向一个全局的hash表ccitable[]中添加一个控件类信息结构类型的指针PCTRLCLASSINFO,该结构定义在src/include/ctrlclass.h
这样,就完成了编辑框控件类的注册,以后创建编辑框控件时,会到这个数组中寻找该控件类的相关信息。
2、自定义控件类
如果我们觉得系统的控件类并不能满足我们的要求,还可以自定义控件类,并注册到系统中。首先我们可以初始化一个WNDCLASS类型的窗口类,给这个类初始化的类名要有别于现有类的类名,然后通过RegisterWindowClass这个函数,注册我们自定义的控件类。看一下这个函数src/gui/window.c
他向桌面线程发送一个消息MSG_REGISTERWNDCLASS,并将我们自己定义的控件类放在lParam参数中。这个消息的处理在src/kernel/desktop-comm.c
可以看到,它依然是通过AddNewControlClass这个函数来向系统注册控件类。