/*本窗口的位置、状态、风格以及窗口标题等*/
U32 status; //本窗口状态
U16 x; //本窗口左上角x坐标
U16 v; //本窗口左上角Y坐标
U16 width; //本窗口的宽度
U16 hight; //本窗口的高度
char *caption} //本窗口标题
U32 style; //本窗口风格
/*指向本窗口私有数据结构的指针*/
void *etrl_str; //指向本窗口的私有数据结构
}ASIX_WINDOW;
实际上,不同的控件拥有不同的功能和结构,所以它们的操作是不同的。为了拥有统一的操作函数接口,为每一个不同的窗口或控件定义了相应的窗口类,窗口类实际上是每种控件的模版,这个模版定义了与该控件相关的内容。当应用程序员调用CreatWindow函数创建某类控件时,CreatWindow查找该类控件的窗口类,并根据窗口类中的定义,调用与该控件相关的创建函数,进行实际的创建工作。然后CreatWindow填写相应的数据结构,描述该控件
类的实例,并将其链接到系统窗口链表中去,以便后续的管理。利用窗口类描述不同控件设计的同时,可以将不同控件的开发独立于系统构架的实现,使得控件的开发可以独立进行。使用独立窗口类来描述每个控件的另一个好处是可以非常方便的对ASIX Window进行裁减。下面给出窗口类数据结构的定义。
typedef struct window_class
{ U8 wndclass_id; //窗口类的ID号
//CreateWindow()调用本函数执行控件的具体创建
STATUS (。create)(char‘caption,U32 style,U16 x,
U16 Y,U16 width,U16 hight,U32 wndid,U32 menH,void*
*etrl_str,void*exdata);
//DestroyWindow()调用本函数执行控件的具体删除
STATUS (*destroy)(void*ctrl_str);
//DefWindowProc()调用本函数进行消息处理
STATUS (。msg_proe)(U32 win_id,U16 asix_msg·U32
lparam.void*data,U16 wparam.void*reserved);
//GetMessage()调用本函数进行底层消息的翻译与转换
STATUS (*msg_trans)(void*ctrl_str,U16 msg_type,
U32 areald.P_U16 data,U32 size,PMSG trans_msg);
//RePaintWindow()调用本函数重绘本窗口类控件
STATUS (*repaint)(void*ctrl_str,U32 Iparam);
//SetWindowText()调用本函数设置本窗口类控件的标题
STATUS (*caption)(void*ctrl_str,char*caption,void* exdata);
WNDCLASS;
图2所示是系统中窗口链表的结构,系统还维护了一张任务链表,每个任务控制块(TCB)中都保留了指向本任务窗口链表的首指针。