基于控件的传统symbian OS架构之调试小结
2010-05-31 20:07:00 来源:WEB开发网主要的区别就是UI的构造函数:
void CHelloWorldBasicAppUi::ConstructL()
{
BaseConstructL();
TRect rect = ClientRect();
iAppView = CHelloWorldBasicAppView::NewL(TRect(rect.iTl.iX,
rect.iTl.iY,
rect.Width(),
rect.Height()/2+rect.iTl.iY));
iAppView2 = CHelloWorldBasicAppView2::NewL(TRect(rect.iTl.iX,
rect.Height()/2+rect.iTl.iY,
rect.Width(),
rect.iBr.iY));
}
这两个容器的窗口分别占屏幕的上下各一半。
四、让iAppView2仅作为一个复合控件,并称为容器iAppView的一个子控件,和iAppView在一个窗口上显示。
这个地方要比上面复杂一些,我在这里贴出iAppView2的ConstructL()代码:
void CHelloWorldBasicAppView2::ConstructL(const TRect& aRect)
{
iLabel2=new(ELeave) CEikLabel;
iLabel2->SetContainerWindowL(*this);//将不拥有窗口的控件和窗口关联
iLabel2->SetTextL(_L("iLabel2"));
iLabel2->SetUnderlining(ETrue);
iToDoLabel2=new(ELeave) CEikLabel;
iToDoLabel2->SetContainerWindowL(*this);
iToDoLabel2->SetTextL(_L("iToDoLabel2"));
}
可以看到,仅仅是创建了两个Label控件而已,而没有之前的创建窗口CreateWindowL()和激活窗口ActiveWindowL()方法了,因为这里的iAppView2仅仅是作为一个复合控件而已,所以就不需要创建窗口了。其它的方法即SizeChanged()、Draw()、 CountComponentControls()和ComponentControl()都是不变的。
上面的iLabel2->SetContainerWindowL(*this);,参数传递的是当前复合控件对象,虽然复合控件并不拥有窗口,但是通过复合控件iAppView2的SetContainerWindowL()方法中的参数是拥有窗口的iAppView,也就是通过层层上传,最后,这两个Label控件也和要显示在上面的窗口联系起来了。而不是把iAppView直接传递给这两个Label的 SetContainerWindowL()方法,这里必须注意。
因为要将复合控件iAppView2作为容器iAppView的一个子控件,所以iAppView2要作为iAppView的容器类的一个成员变量即:
更多精彩
赞助商链接