当前位置: 首页 > news >正文

深入探索Symbian多视图程序开发

Author:孙东风

Date:04/01/2008

我们知道,在大多数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<CApplicationAppUi*>(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所报告的事件进行响应。

相关文章:

  • summernote html标签,关于summernote编辑器代码段html的插入问题
  • JavaEE下的测试驱动 乱弹
  • html替换标题工具,TEReplace插件快速替换Typecho标题/内容关键字
  • 忙碌并快乐的2008北京春季之旅
  • 山西师范大学数学与计算机学院宿舍,山西师范大学数学与计算机学院介绍
  • 地大计算机学校2020考研大纲,【2020-2021】院校计算机考研初试科目变动情况统计...
  • 北交计算机考研保护一志愿吗,09我的考研之旅(北交计算机)
  • 2010年秋 江苏计算机二级,2011年秋江苏省计算机二级考试参考答案公布(10月15号考试)...
  • Microsoft Announcing Windows Mobile 6.1 from LAS VEGAS April 1, 2008
  • 计算机系统精品课,计算机系统-攀枝花学院精品课程网.ppt
  • 离散点插值方法、等值线的绘制及平滑技巧
  • sql使用正则表达式替换字符中的一个字
  • html水平镜像和垂直镜像,css实现镜像翻转的方法有哪些
  • 小胖子5个月了
  • 计算机等级考试两天是,2017计算机等级考试考前最后两天如何调整备考心态
  • Angular数据绑定机制
  • ComponentOne 2017 V2版本正式发布
  • Golang-长连接-状态推送
  • Java 23种设计模式 之单例模式 7种实现方式
  • Java超时控制的实现
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 读懂package.json -- 依赖管理
  • 对象引论
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 提醒我喝水chrome插件开发指南
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 新手搭建网站的主要流程
  • 字符串匹配基础上
  • 【云吞铺子】性能抖动剖析(二)
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​LeetCode解法汇总518. 零钱兑换 II
  • # 达梦数据库知识点
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (30)数组元素和与数字和的绝对差
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (十六)Flask之蓝图
  • .NET : 在VS2008中计算代码度量值
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [<死锁专题>]
  • [autojs]autojs开关按钮的简单使用
  • [AutoSar NVM] 存储架构
  • [C#]OpenCvSharp使用帧差法或者三帧差法检测移动物体
  • [HTML]Web前端开发技术7(HTML5、CSS3、JavaScript )CSS的定位机制——喵喵画网页
  • [IE编程] 如何编程清除IE缓存
  • [iOS开发]iOS中TabBar中间按钮凸起的实现
  • [LeetCode]--61. Rotate List
  • [Linux] PXE批量装机
  • [Machine Learning] Learning with Noisy Labels
  • [NISACTF 2022]easyssrf
  • [NLP] 使用Llama.cpp和LangChain在CPU上使用大模型
  • [one_demo_3]漩涡递增矩阵
  • [RoarCTF 2019]Easy Calc
  • [SDOI2005]区间