基于控件的传统symbian OS架构之调试小结
2010-05-31 20:07:00 来源:WEB开发网AddToStackL(iAppView);将容器放到栈顶,从而可以接收用户的事件,如果想让其他容器接收事件的话,就可以通过另一个方法,RemoveFromStatck(iAppView)将当前容器从栈顶移出,然后在将其他容器移入该栈顶即:AddToStackL(iAppView2);
CHelloWorldBasicAppUi::~CHelloWorldBasicAppUi()
{
if (iAppView)
{
iEikonEnv->RemoveFromStack(iAppView);
delete iAppView;//调用容器Container的析构函数,销毁容器对象即iAppView
iAppView = NULL;//注意,一定要将指针置空,否则就会称为悬空指针,也就是野指针。
}
}
在析构函数中销毁创建的容器实例。
需要注意:容器实例iAppView必须是UI类的私有成员,即:
private:
CHelloWorldBasicAppView* iAppView;
小结:这里面出现几个概念,比如屏幕、窗口、容器、复合控件等,比较容易让人混淆。我的理解是这样子的:屏幕就只有一个,也就是手机的显示屏,是一个物理概念;而窗口是逻辑上的概念,一个程序里我们可以创建多个窗口,下面的一个例子我就来说明这个问题;容器和复合控件都是继承自控件基类CCoeControl,并且它们的类定义中都有子控件成员,不同之处就是容器拥有自己的窗口,而复合控件没有,我们可以把复合控件加到其他的复合控件或容器上,我也会在下面的例子里加以实现。
二、屏幕上面切换显示两个窗口
每个窗口都有两个Label。
最开始,我是想这样来实现:让第一个iAppView创建一个窗口,而第二个iAppView2(实际上就是一个复合控件)不再创建新的,而是共用 iAppView创建的窗口。试验的时候,在UI的ConstructL()方法里,先创建iAppView,在将拥有窗口的容器iAppView作为参数传递到iAppView2的构造函数中,但却发现并不能实现。
因此,我只能也给iAppView2也创建一个窗口,看这两个容器类的构造函数如下:
void CHelloWorldBasicAppView::ConstructL(const TRect& aRect)
{
// Create a window for this application view
CreateWindowL();//复合控件创建窗口
iLabel=new(ELeave) CEikLabel;
iLabel->SetContainerWindowL(*this);//将不拥有窗口的控件和窗口关联
iLabel->SetTextL(_L("iLabel"));
更多精彩
赞助商链接