我们知道,在大多数gui的applications中,视图之间的切换是极其频繁的。那么如何组织这些视图以及视图之间的通讯,就成为大多数applications所要面对的问题。
在symbian中多视图应用程序之间的视图管理可以用下图来表示:
其中appui管理appview,而appview又管理container。
appui继承自caknviewappui,其管理appview的代码如下:
cappview1* iview1 = new(eleave) cappview1;
cleanupstack::pushl( iview1 );
videoview->constructl();
addviewl(iview1 );
cleanupstack::pop();// view1
cappview2* iview2 = new(eleave) cappview2;
cleanupstack::pushl(iview2 );
userview->constructl();
addviewl( iview2);
cleanupstack::pop();// view2
setdefaultviewl(*iview1);
而其中每个view又继承自 class cappview1: public caknview , public mcoecontrolobserver
class cappview2: public caknview , public mcoecontrolobserver
view之间要想实现自由的切换,就必须定义一个tuid作为自身的唯一标识并实现caknview的方法
// uid of view
const tuid kviewid = {1};
/**
* from caknview returns uid of view
* @return tuid uid of the view
*/
tuid id() const;
那么从一个view跳转到另一个view就需要下面的代码
((caknviewappui*)(ieikonenv->appui()))->activatelocalviewl( tuid::uid( 3 ));或
static_cast(ieikonenv->appui())->activatelocalviewl( tuid::uid( 3 ));
上面的代码讲述了appui如何管理众多的view以及view之间的切换,那么下面讲述每个view是如何管理它里面众多的containers的。
首先要明白view继承自caknview,它做为container(继承自ccoecontrol)的容器通过以下的代码激活某个container
icontainer = new (eleave) capplicationcontainersetting;
icontainer->constructl( kfullscreen );
icontainer->setmopparent(this);
icontainer->setobserver(this);
icontainer->setapplicationdbengine(idbengine);
appui()->addtostackl( *this, icontainer );
那么在doactivatel()中通过以上代码放置初始显示的container。
那么view是如何管理众多的container的呢?
从以上代码可以看出,负责container管理的view都继承自mcoecontrolobserver,而icontainer->setobserver(this)则把当前的container注册到mcoecontrolobserver,从而实现了view对其内部container的监听。
view中继承自mcoecontrolobserver的接口void handlecontroleventl(ccoecontrol* acontrol,tcoeevent aeventtype)则负责每个container所报告的事件的处理。
注意:如果view中并没container,那么就没必要继承自mcoecontrolobserver。
而container继承自ccoecontrol(它是handlecontroleventl的一个参数),ccoecontrol中提供下面的方法对view中的handlecontroleventl()报告事件。
case estdkeydevice1://右键
{
reporteventl((mcoecontrolobserver::tcoeevent)ecmddeletevideocontainer);
break;
}
而view通过以下方法对上面代码所报告的事件进行处理。
void cappview1::handlecontroleventl(ccoecontrol* acontrol,tcoeevent aeventtype)
{
switch(aeventtype)
{
case emenuitemcmdback:
{
((cavasappui*)(ieikonenv->appui()))->handlecommandl(eeikcmdexit);
break;
}
case ecmddeletevideocontainer:
{
break;
}
default:
break;
}
}
从上面的分析可以看出:
appview通过继承自caknview并通过activatelocalviewl()切换视图。
而appview通过继承自mcoecontrolobserver监听众多的container,并在handlecontroleventl()里对container所报告的事件进行响应。
![]()
如果喜欢深入探索symbian多视图程序开发 - symbian请收藏或告诉您的好朋友.
阅读(231) | 评论(0) | 转发(0) |