Chinaunix首页 | 论坛 | 博客
  • 博客访问: 569383
  • 博文数量: 1357
  • 博客积分: 3000
  • 博客等级: 中校
  • 技术积分: 14950
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-14 20:23
文章分类

全部博文(1357)

文章存档

2010年(1357)

我的朋友

分类:

2010-09-23 16:55:47

   我们知道,在大多数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) |
给主人留下些什么吧!~~