深入探索Symbian多视图程序开发
2011-07-22 16:01
330 查看
Author:孙东风
Date:04/01/2008
http://blog.csdn.net/dongfengsun/article/details/2234513
我们知道,在大多数GUI的Applications中,视图之间的切换是极其频繁的。那么如何组织这些视图以及视图之间的通讯,就成为大多数Applications所要面对的问题。
在Symbian中多视图应用程序之间的视图管理可以用下图来表示:
其中AppUI管理AppView,而AppView又管理Container。
AppUI继承自CAknViewAppUi,其管理AppView的代码如下:
而其中每个View又继承自
View之间要想实现自由的切换,就必须定义一个TUid作为自身的唯一标识并实现CAknView的方法
那么从一个View跳转到另一个View就需要下面的代码
上面的代码讲述了AppUI如何管理众多的View以及View之间的切换,那么下面讲述每个View是如何管理它里面众多的Containers的。
首先要明白View继承自CAknView,它做为Container(继承自CCoeControl)的容器通过以下的代码激活某个Container
那么在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()报告事件。
而View通过以下方法对上面代码所报告的事件进行处理。
从上面的分析可以看出:
AppView通过继承自CAknView并通过ActivateLocalViewL()切换视图。
而AppView通过继承自MCoeControlObserver监听众多的Container,并在HandleControlEventL()里对Container所报告的事件进行响应。
/////////////////////////////////////////////
APPUI类负责视图的创建和切换,它继承自CAknViewAppUi ,调用AppUi()->ActivateLocalViewL(uid)方法根据Tuid可以激活视图。
所有的视图必须在视图服务器(CAknViewAppUi )类注册才可以使用。(注册方法如:AddViewL(iMainView);)
在任意时刻只有一个视图处于激活状态。视图必须在资源文件中定义,每一个视图都可以有自己的菜单,所以定义视图也定义各自的cba按钮类型和菜单项。定义完后在二阶构造中调用BaseConstructL( aResId );函数构造视图。视图类继承自CAknView ,它有以下三个方法必须覆写:
TUid Id() const; //根据id判断视图,此id 在hrh 文件中定义
void DoActivateL( const TVwsViewId& aPrevViewId,
TUid aCustomMessageId,
const TDesC8& aCustomMessage ); //负责激活视图或容器
此函数中构造容器类对象,容器类继承自CcoeControl.负责视图的显示
void DoDeactivate(); //负责删除视图或容器
每个视图类有自己的命令处理函数 void HandleCommandL( TInt aCommand ); 处理自己的菜单命令也可以调用AppUi类的菜单命令处理(AppUi()->HandleCommandL( aCommand );)
注意:使用AppUi()需要 #include <aknviewappui.h>
Date:04/01/2008
http://blog.csdn.net/dongfengsun/article/details/2234513
我们知道,在大多数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); |
class CAppView1: public CAknView , public MCoeControlObserver class CAppView2: public CAknView , public MCoeControlObserver |
// UID of view const TUid KViewId = {1}; /** * From CAknView returns Uid of View * @return TUid uid of the view */ TUid Id() const; |
((CAknViewAppUi*)(iEikonEnv->AppUi()))->ActivateLocalViewL( TUid::Uid( 3 ));或 static_cast<CApplicationAppUi*>(iEikonEnv->AppUi())->ActivateLocalViewL( TUid::Uid( 3 )); |
首先要明白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 ); |
那么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; } |
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所报告的事件进行响应。
/////////////////////////////////////////////
APPUI类负责视图的创建和切换,它继承自CAknViewAppUi ,调用AppUi()->ActivateLocalViewL(uid)方法根据Tuid可以激活视图。
所有的视图必须在视图服务器(CAknViewAppUi )类注册才可以使用。(注册方法如:AddViewL(iMainView);)
在任意时刻只有一个视图处于激活状态。视图必须在资源文件中定义,每一个视图都可以有自己的菜单,所以定义视图也定义各自的cba按钮类型和菜单项。定义完后在二阶构造中调用BaseConstructL( aResId );函数构造视图。视图类继承自CAknView ,它有以下三个方法必须覆写:
TUid Id() const; //根据id判断视图,此id 在hrh 文件中定义
void DoActivateL( const TVwsViewId& aPrevViewId,
TUid aCustomMessageId,
const TDesC8& aCustomMessage ); //负责激活视图或容器
此函数中构造容器类对象,容器类继承自CcoeControl.负责视图的显示
void DoDeactivate(); //负责删除视图或容器
每个视图类有自己的命令处理函数 void HandleCommandL( TInt aCommand ); 处理自己的菜单命令也可以调用AppUi类的菜单命令处理(AppUi()->HandleCommandL( aCommand );)
注意:使用AppUi()需要 #include <aknviewappui.h>
相关文章推荐
- 深入探索Symbian多视图程序开发
- 深入探索Symbian多视图程序开发
- 深入探索Symbian多视图程序开发
- 深入探索Symbian多视图程序开发
- 深入探索Symbian导航面板开发
- Symbian多视图程序开发及视图管理
- 深入探索Symbian活动对象开发
- 【微信小程序开发•系列文章二】视图层
- Android开发艺术探索——新的征程,程序人生路漫漫!
- 深入探索MS COM开发框架 之 MFC和ATL(二)
- 微信小程序开发《7 .框架之视图层--wxml》
- 深入探索COM开发框架 之 MFC和ATL [三]
- 微信小程序开发系列二:微信小程序的视图设计
- Android开发艺术探索——新的征程,程序人生路漫漫!
- 深入探索MS COM开发框架 之 MFC和ATL(三)
- Symbian程序开发调试技术
- 开发艺术探索 -- 动画深入分析
- 深入探索COM开发框架 之 MFC和ATL [四]
- Java性能调优_深入Java程序性能调优(并行开发、JVM调优)
- 使用Eclipse RCP进行桌面程序开发(三):视图和透视图