17.5.3 复合控件
布局寄宿控件,比如在连三子应用程序视图中,需要使用某种结构。如第15章提到的,使用复合控件(compound control)实现这种规范,其定义为如果在自身之外还有一个或多个组件控件,这个控件就是复合的。
组件控件完全包含在拥有它的控件区域内。
控件的所有组件控件必须拥有非重叠矩形。
组件控件不一定是寄宿控件,它可以拥有窗口。然而在大多数情形下,组件控件是寄宿控件。
为了向CONE框架指出组件控件的拥有权关系,复合控件必须实现来自CCoeControl的两个虚函数:
CountComponentControls()指出控件有多少个组件。默认值为0,但可以重写它;
ComponentControl()返回第 n 个组件,n 从 0 到组件个数减 1。默认状态下,这一函数抛出严重错误(因为如果没有组件,它就根本不会得到调用)。如果改写了Count Component Controls(),也应该改写这一函数,以对每一可能的n值返回一个组件。
如果控件包含了固定数目的组件,一个便利的Symbian操作系统的惯用法是为它们的控件提供枚举,比如:
CountComponentControls()函数简单返回EAmountOfControls,它的好处是添加或删除控件后,不会忘记改变返回值。
如果控件包含可变数目的控件,必须动态地评估返回值。如果控件包含固定数目的组件,ComponentControl()的简单实现可以是一个 switch 语句,每个 case 硬性编码为对应组件控件的地址,如下面代码所示。
对话框也是典型的带有单一窗口的复合控件,但对话框的组件控件的数目是不可预测的,在这种情况下,取代上面 CountComponentControls()和 ComponentControl()的硬性编码,CEikDialog使用可变长度数组来存储对话框行,并动态地计算出这些函数的返回值。
【责任编辑:
董书 TEL:(010)68476606】