WEB开发网
开发学院手机开发Symbian 开发 基于控件的传统symbian OS架构之调试小结 阅读

基于控件的传统symbian OS架构之调试小结

 2010-05-31 20:07:00 来源:WEB开发网   
核心提示:主要的区别就是UI的构造函数:void CHelloWorldBasicAppUi::ConstructL(){BaseConstructL();TRect rect = ClientRect();iAppView = CHelloWorldBasicAppView::NewL(TRect(rect.iTl.iX,re

主要的区别就是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的容器类的一个成员变量即:

上一页  1 2 3 4 5 6 7 8  下一页

Tags:基于 控件 传统

编辑录入:coldstar [复制链接] [打 印]
赞助商链接