![Rank: 8](images/default/star_level3.gif) ![Rank: 8](images/default/star_level3.gif)
- UID
- 872238
|
![](http://images.eccn.com/silabs/silicon_chip_980x60_202203.jpg)
实际上,不同的控件拥有不同的功能和结构,所以它们的操作是不同的。为了拥有统一的操作函数接口,为每一个不同的窗口或控件定义了相应的窗口类,窗口类实际上是每种控件的模版,这个模版定义了与该控件相关的内容。当应用程序员调用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)中都保留了指向本任务窗口链表的首指针。
3 消息传递与处理
每个窗口(Form)都拥有自己的消息处理函数,该函数接收来自系统(包括窗口和控件)的消息并作相应的处理和动作。每一个窗口处理函数实际上就是一个消息循环,窗口函数通过取消息函数ASIXGetMessage()获得系统任务,并发送给该窗口的消息进行处理。ASIX(GetMes—sage()获得系统消息并进行相应的处理和消息转换(实际上是将底层操作系统所提供的硬件消息转换成ASIXWindow的消息,该函数通过调用相应窗口类所定义的消息翻译函数msg-trans()实现消息的转换),然后窗口函数对消息进行分检并作相应的处理,这部分代码是用户自己定制的,实际上是用户程序处理来自窗口和控件的消息,用来实现该应用程序的功能。窗口函数调用ASIX Win—dows的控件消息处理函数DefWindowProc(),该函数是一个消息过滤器及转换器,它接管非用户的,属于控件自己的消息(这个消息可能来自用户的操作)。它首先扫描由取消息函数获得的消息,检查其中是否有属于ASIXWindows控件的消息。如果该消息属于某个控件,则消息处理函数调用系统窗口链表中该控件所对应的窗口类所指明的消息处理函数,处理这个消息执行相应的动作并可能发出相应的消息(例如,当用户点击某按钮时,控件消息处理函数将接管该点击事件,并执行按钮被点击的动画,同时发送一条该按钮被点击的消息)。
4 图形接口
ASIX Windowr的图形接口设计引入了硬件抽象层的概念,图形函数(Graphic API)不直接操纵硬件,而是通过调用硬件抽象层提供的一组基本函数来作具体的图形绘制工作。硬件抽象层函数将按照设备相关的格式将要显示的内容首先填写到系统内存的一片缓冲区(VRAM)中,然后硬件抽象层的函数将根据传入的参数决定是否将数据复制到LCD控制器。如果所调用函数的应用任务当前拥有LCD(前台任务),则将数据送往LCD控制器,否则该函数仅仅将数据写人VRAM缓冲区(该任务是后台任务)。硬件抽象层还提供了一个叫做Refresh的函数,该函数将把当前VRAM中的内容复制到LCD控制器的数据寄存器中。系统任务在应用任务切换的时候调用Refresh函数,将切换进来的任务中所属VRAM的数据刷新到LCD中去,实现屏幕的切换,如图3所示。 |
|