18.3.6 控件观察器

来源:互联网 发布:淘宝商家电话人工 编辑:程序博客网 时间:2024/04/30 02:27


http://book.51cto.com  2009-08-26 16:23  曾严 译  人民邮电出版社  我要评论()
摘要:《Symbian OS C++手机应用开发(第3卷)》深入介绍了Symbian操作系统C++手机开发的各方面知识,第18章介绍如何使用控件让用户与程序进行交互。本节说的是控件观察器。
标签:交互  控件  触笔  Symbian OS C++手机应用开发
Oracle帮您准确洞察各个物流环节

18.3.6  控件观察器

复合产生了在坐标上严格相关的控件层次。组件被包含在它们的容器范围内,而且控件之间不能发生重叠。正如我们所见到的,这大大简化了绘图工作,同时还能使触笔事件的处理变得更加容易。绘图和触笔事件的处理在控件层次中自顶向下进行操作,即从对话框到它的每一个控件。控件还报告它们的状态是否被更改等事件。事件报告通常上升到层次顶部—从控件上升到对话框—因此可以用对话框的HandleControlStateChangeL()函数处理事件。

因此,许多系统把事件向上传递到窗口拥有关系的层次上,以处理事件链。不过,让事件报告层次与复合层次顺序刚好相反却显得非常笨拙。

在Symbian操作系统中,键设计决策是为了避免固定事件观察器和容器控件之间的关联。观察器不必是容器控件,或者包含层次中的控件,它甚至根本不必是控件。

如果容器是观察器,为什么不就说“容器”和其他系统一样有一个拥有关系层次呢?首先,因为控件可以在不需要观察它们的容器中使用;其次,因为对话框不是真正的选项列表控件的直接容器—对话框包含一个带标题的包含选项列表的控件。但是对话框是选项列表的直接观察器。

在 Symbian 操作系统中,每个控件包含一个名叫 iObserver 的成员,它可以用于报告对话框中所有控件所需要的不同的通用事件。

 


MCoeControlObserver是一个可以由任何期望能观察控件的类实现的接口。它在 coecobs.h中定义,它只有一个成员函数。

 


如果编写一个控件,则可以调用 ReportEventL()来向观察器报告事件,让观察器有机会进行相关处理。

可用的事件类型在MCoeControlObserver::TCoeEvent中定义。它们是:

 


关于这些事件的更多细节以及连三子应用程序中的控件观察器的例子,可以在第15章找到。

1.状态改变事件 如果要实现一个通用控件,那么唯一需要报告的有用的事件是 EEventStateChanged。如果是从对话框内报告该事件,对话框框架则会调用函数 HandleControlStateChangeL(),对话框的实现者可以使用它改变该对话框中其他控件的值和可见性。

对某些控件来说,报告状态改变为可选功能。例如编辑窗口仅在被要求这样做时才报告状态改变—不然的话,每一次按键操作(导航键例外)都将会引发状态改变。 

应该仅在达到有效状态后才报告状态改变—而比如,在数值编辑器中的值为非法值时,报告状态改变的做法就是不恰当的。 

2.其他事件 MCoeControlObserver接口是针对所包含控件(响应状态变化)和容器(响应交互拒绝、准备焦点转移以及请求焦点事件)的通用要求而设计的。专用事件必须由专用接口进行处理,例如菜单中的MEikMenuObserver。