17.6.2 拥有窗口和寄宿控件
控件可能是拥有窗口的或者是寄宿者。如图 17.12 所示,拥有窗口控件有一个窗口,寄宿者只是使用一个窗口。
在控件的生命周期内,都有一个iWin成员指向某个可绘制的窗口。这个可绘制的窗口可能是标准窗口(RWindow),或者是备份窗口(RBackedUpWindow)。RDrawableWindow是这两者的一个基类。
可以从具体控件类的第二阶段构造函数中调用CCoeControl函数,指明它是拥有窗口控件还是寄宿控件。
用来指定和测试窗口的函数有:
从派生的控件或应用程序 UI 类,包括你自己应用程序的应用程序 UI,你可以通过 iCoeEnv来访问 CCoeEnv。如果有一个指向控件或应用程序 UI 的指针,可以使用它的公共函数ControlEnv()。如果这两者都不能访问,可以使用静态函数CCoeEnv::Static(),它使用线程本地存储(TLS)来找出当前环境。如果需要频繁的访问,因为TLS不是特别快,还可以在对象的某个地方存储一个指针用于更快的访问。
控件环境包括以下工具(见图17.11):
CreateWindowL()函数创建一个新窗口,它可以是标准窗口,也可以是备份窗口。
SetContainerWindow()函数告诉控件使用一个现有的标准窗口或备份窗口。若控件自身是与同一窗口相关联控件的组件,则应该使用这一函数。SetContainerWindowL()告诉控件寄宿到某个现有控件,因此,它最终使用某个现有窗口。
SetContainerWindowL()既是虚函数,也可能发生异常退出。在Symbian操作系统中这不是最佳设计:实际上,它应该两者都不是。确保如果不重写这一函数它就不会异常退出,因此设法将这一函数看成非设计为要被重写的。少数几个Uikon类将它用于通过其他手段也能实现的某些目的。
【责任编辑:
董书 TEL:(010)68476606】