PPSM嵌入式RTOS中的窗口系统开发
(3)消息的处理
PPSM中定义了一系统硬件中断产生的消息,如IRPT_TIMER、IRPT_RTC、IRPT_UART等等;同时,提供SendMessage和AdvSendMessage函数允许发送用户自定义消息。用户自定义消息从IRPT_USER开始。一个程序可以发送到另一个应用程序或自己。这些消息和所有系统消息均由应用程序的顶层窗口处理。应用程序从其消息队列中取得消息后,首先,由预定义的应用程序消息处理函数处理公共的消息。然后,由为顶层窗口定义的消息处理函数处理。顶层窗口不处理的消息由预定义的窗口消息处理函数处理。
消息发送采用两种方式。第一种是Send Message(),该函数将消息放在应用程序的消息队列中并立即返回;第二种是直接调用应用程序顶层窗口的消息处理函数,这样函数便在消息处理之后返回。
(4)控件体系
窗口只是提供了界面设计操作的基础。窗口中需要一系列按功能和操作方式分类的可视的界面元素,以便编程人员能够方便地设计窗口的界面,实现窗口的特定功能。这样的界面元素叫控件。
由于嵌入式设备内存有限的原因,控件并不采用子窗口的方式。根据设计控件的目的,各类控件具有较为确定的外观和规定的动作,并在特定的条件下,向其父窗口发出预定义的消息以供其处理。
控件属于父窗口。在父窗口显示时自动显示,在父窗口关闭时自动释放其占用的内存空间;父窗口接收的消息首先在各控件中分发处理。按照这一要求,窗口必须保存、维护其控件的一个列表。列表中控件的指针按控件创建的顺序存放。控件按创建的顺序显示,而消息在控件中按反序传递,以保证后创建的控件在可以覆盖之前创建的控件的图形和操作。
为了提高控件开发效率,我们需要各控件可以作为一种新定义控件的子控件。这样新定义的控件可以利用已有的控件功能。如文本框控件中可以包含水平和垂直滚动条子控件。
控件可分为有焦点和无焦点的。有焦点的控件可以处理输入法发出的字符消息。
3 窗口体系的实现
3.1 窗口的运行结构
根据以上对窗口体系的总体考虑,确定窗口的运行结构需要以下内容:
① 窗口的位置、大小和标题。
② 窗口的风格:
WS_MAINWND——应用程序主窗口。关闭主窗口将自动关闭应用程序。
WS_POPUP——弹出式窗口。单击非窗口区域将自动关闭该窗口。该属性不能和WS_MAINWND同时出现。
WS_NOBORDER——无边框窗口。
WS_NOSTATEBAR——无状态条控件的窗口。一般窗口均有一个在窗口底部的状态条,提供弹出该窗口的命令菜单、显示窗口标题、关闭窗口、打开选择输入法、显示系统日期和时间等功能。
③ WS_POPUP类窗口的屏幕活动区和窗口活动区的ID。
④ 窗口当前的光标位置。
⑤ 窗口中控件的列表。
⑥ 窗口保存其覆盖区域的内存指针。
⑦ 前一个窗口的指针。用以在关闭窗口时重设应用程序的顶层窗口。
⑧ 窗口的缺省输入法类型和打开的输入法控件的句柄。
⑨ 窗口的焦点控件的句柄。焦点控件将最先处理字符输入的消息。
⑩ 窗口的消息处理函数指针。
3.2 窗口的创建和操作函数介绍
① HWND CreateWindow(WNDCLASS &wndCls);
WNDCLASS结构定义窗口的基本属性,如位置、大小、标题、风格等,见上面所述。该函数为窗口运行时的结构分配内存,初始化属性,并返回窗口结构的指针。
② BOOL ShowWindow(HWND hWnd);
显示一个窗口。其工作包括:挂起以前的活动区;保存窗口的覆盖区域的图形;如果是有WS_POPUP属性的窗口,须设定屏幕和窗口的活动区;向该窗口的消息处理函数传递WM_ONSHOW消息(事实上是直接调用该函数),以提供编程人员在窗口上绘制控件以外的图形的机会;如果是没有WS_NOSTATEBAR的窗口,添加Statebar控件;依次调用窗口中各控件的绘制函数以显示控件;设第一个有焦点控件为窗口当前的焦点控件。
③ BOOL CloseWindow(HWND hWnd);
关闭一个窗口。其工作包括:向该窗口的事件处理函数发送WM_CLOSE消息,如果返回FALSE则退出本函数,如果返回TRUE则继续以下工作 ——恢复窗口覆盖区图形;释放POPUP类窗口的屏幕活动区和窗口活动区; 依次释放该窗口包含的控件;隐藏光标;释放该窗口结构占用的内存;向上层窗口发送WM_TOPWNDCLOSE的消息,该消息用于下层窗口更新需要自动变化的界面,如股票实时大盘数据表;设置该窗口的前一层窗口为应用程序的顶层窗口。
④ WNDPROC函数指针类型。
typedef BOOL (*WNDEVENTHANDLE)
(HWND hWnd, U16 msgType, U32 id,P_U32 data, U32 size);
⑤ DefWndProc(HWND hWnd, U16 ms