control可以象窗口一样嵌套,一个compound control应该重载两个函数:CountComponentControls和ComponentControl。Compound control也需要处理按键事件的分派问题。
在CONE中维护着一个控件堆栈,用来管理the channeling for the application,控件堆栈包括了那些需要按键事件的控件的列表。事件会根据他们在堆栈中的位置传递到他们那。
创建简单控件
1.创建一个派生于CCoeControl的类
2.实现构造代码(通常在ContructL()函数中)
3.重写虚函数Draw(),为控件提供绘制代码
4.重写虚函数SizeChanged(),在控件尺寸更改时重新布置它
每个控件都应该拥有一个ContructL()方法以执行其二段构造函数。对于大多数控件来说,该方法至少将执行下列步骤:
1.设置控件窗口窗口。这既可以是新窗口(这种情况下控件成为拥有窗口的控件),也可以是已经存在的窗口(这种情况下控件不拥有窗口)。
2.设置控件的工作区矩形,即此控件负责绘制的屏幕区域。
3.激活控件。这将通知UI框架已准备绘制该控件。
创建复合控件
复合控件的实现同简单控件相同,此外还需要完成以下工作
1.为该控件添加组件控件,通常把组件控件作为复合控件类的成员数据
2.重写虚函数CountComponentControls()和ComponentControl()以确保组件控件被绘制
复合控件的绘制由三个函数共同负责:Draw(),CountComponentControls()和ComponentControl()。发生的次序为:
1.调用复合控件的Draw()
2.之后框架调用复合控件的CountComponentControls()获取其组件控件的个数
3.框架通过调用ComponentControl()遍历所有组件控件,获取每个控件的指针
对于复合控件来说,Draw()通常无关紧要,因为真正的绘制工作一般会被委派给组件控件。但规范的做法是,在绘制组件控件前,复合控件至少该用默认颜色填充其客户矩形。
为使复合控件正常工作,最后需要添加SizeChanged()函数,与CSimpleControl不同,CCompoundControl需要一些重要代码来确保其组件控件的尺寸被正确的设置。