`
yesjavame
  • 浏览: 687127 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Symbian学习笔记(3):应用程序框架

阅读更多
开发symbian的GUI应用是有模板的,用Carbide C++的工程向导可以自动生成程序的基本框架。不过可能与安装的SDK版本有关,我现在只能生成一个AppUi一个Container的常规模板(以前用2nd FP3时还可以生成多个view多个container的视图模板)。

不管是哪一种模板,它们共同的部分是入口函数、Application和Document。即以下三个文件是所有工程都具有的:

1)有一个与工程同名的cpp文件,它只提供了两个全局函数,是程序执行的入口,负责创造Application。这个文件我们不用管它。

2)有一个以工程名+Application命名的类,派生于CAknApplication,它负责创建文档类并提供应用的UID。一般情况下它也不需要我们操心,但是因为它提供了一个函数OpenIniFileLC,如果我们需要在启动程序时加载ini文件中的配置,可以重载它。

3)有一个以工程名+Document命名的类,派生于CAknDocument,它负责创建Ui类,同样一般情况我们不管它,但是它也提供了一个函数OpenFileL,如果需要加载普通文件,也可以重载它。

下面来看看两种模板的不同点吧。

一. 基于CCoeControl的常规模式

这种模式的特点是一个AppUi类并且对应一个Container类。

它在上述三个文件以外,还有下面两个文件:

4)有一个以工程名+AppUi命名的类,派生于CAknAppUi,它主要的工作是负责用户接口(所谓的UI)并且创建Container类,所以它是我们关注的重点之一。

它最重要的成员函数是HandleCommandL,这个函数来自于CEikAppUi类,负责处理各种命名/事件。

有两个函数DynInitMenuBarL和DynInitMenuPaneL,如果需要动态更改菜单的项目,可以重载它们。
HandleKeyEventL函数则可以在需要自己处理键盘事件时重载一下。

此外,这个AppUi还提供一些比较常用的函数,比如:

Document() 可以获取Document对象指针。
Application() 可以获取Application对象指针。
StatusPane() 可以获取状态栏的指针。
Cba() 可以获取控制栏的指针。

5)有一个以工程名+Container命名的类,派生于CCoeControl,它负责内容的展示,也是我们关注的重点。

如果需要在界面上增加控件类类的东西,都是在这个类中实现,总的来说,它负责所有与界面展示相关的东西。

它有一个Draw函数,但是如果我们是通过控件来展示信息,则这个函数里的代码似乎与我们关系不大,除非我们的界面完全是靠画出来的。

另两个函数ComponentControl和CountComponentControls分别获取控件与获取控件个数,在依赖于控件展示的GUI应用中则更为重要。

因为它实现了接口MCoeControlObserver,所以函数HandleControlEventL也需要实现一下。

利用它的成员iCoeEnv可以取到AppUi类的指针,不过需要强制转型一下,如:STATIC_CAST(CiMusicAppUi*,iCoeEnv->AppUi())->...

二. 基于CAknView的MVC模式

这种模式的特点是在AppUi类与Container类之间增加一个AppView的类,即一个AppUi对象,N个AppView和N个Container。

除了公共的三个文件以外,它包括的文件有:

4) 有一个以工程名+AppUi命名的类,派生于CAknViewAppUi类,其实也是间接派生于CAknAppUi类,它的工作职责与常规模式中的AppUi类也基本相同。

唯一的区别在于它不是直接创建Container类,而是创建AppView类,并且是创建多个AppView类。同时它还需要负责将创建的view加入视图栈里AddViewL。
CiMusicViewMusic*view1=new(ELeave)CiMusicViewMusic;
CleanupStack::PushL(view1);
view1
->ConstructL();
AddViewL(view1);
//transferownershiptoCAknViewAppUi
CleanupStack::Pop();//view1

CiMusicViewFavt
*view2=new(ELeave)CiMusicViewFavt;
CleanupStack::PushL(view2);
view2
->ConstructL();
AddViewL(view2);
//transferownershiptoCAknViewAppUi
CleanupStack::Pop();//view2

CiMusicViewWeb
*view3=new(ELeave)CiMusicViewWeb;
CleanupStack::PushL(view3);
view3
->ConstructL();
AddViewL(view3);
//transferownershiptoCAknViewAppUi
CleanupStack::Pop();//view3

this->ActivateLocalViewL(KViewMusicId);

5)有多个以工程名+View命名的类,派生于CAknView类。它负责分担AppUi部分事件的处理,所以,它也有HandleCommandL函数。

此外,它的DoActivateL和DoDeactivate两个函数在当前视图激活或失活时被调用,需要重载一下。

在激活时,需要创建视图对应的Container类,并且调用Container的SetMopParent为自己,还要在上层的AppUi中将这个Container加入栈中。一般代码如下:
iContainer=new(ELeave)CiMusicContainerFavt;
iContainer
->SetMopParent(this);
iContainer
->ConstructL(AppUi()->ApplicationRect());
iContainer
->listType=type;
AppUi()
->AddToStackL(*this,iContainer);

注意,它的AppUi()可以得到它的上层的AppUi对象指针。

失活时则正好相反,需要
if(iContainer)
...{
AppUi()
->RemoveFromViewStack(*this,iContainer);
}

deleteiContainer;
iContainer
=NULL;

6)有多个以工程名+Container命名的类,派生于CCoeControl并实现接口MCoeControlObserver,所以它的行为与常规模式中的Container类似。

这种模式可以有效地组织应用程序,根据应用的多个功能界面切割成数个模块(视图)。由多个AppView来分担AppUi中的事件处理,负责自己这个视图下的具体行为与显示。

各个视图之间的切换也很简单:
STATIC_CAST(CiMusicAppUi*,iCoeEnv->AppUi())->ActivateLocalViewL(KViewMusicId);


[补充]
三 比较两种模式

有些教材还提出过对话框模式,但是我觉得那似乎不太实用,也没注意过它的结构组成。

对比上述两种架构模板,很显然,第二种基于视图的模板应该更有实用性一点,除非程序实在简单。

不过,这里的“视图”很容易让人产生误解。一般我们说MVC的时候,模型-视图-控制器,但是这里的AppView其实对应的控制器,而Container对应的则是视图。

所以在新的SDK里,第一种模板中由向导生成的工程中源于CCoeControl的类名改成了AppView,对应继承于CAknAppUi控制器的类名叫AppUi。因为我没有看到多视图的工程生成的代码,如果这样的话,估计也应该对应的改一下吧。

[补充@2008-03-20]
在多视图构架中要注意几个地方:

1、在AppUi的析构函数中千万不要去删除AppView的实例,否则会有错误。

2、在AppView的析构函数中调用一下DoDeactivate(),因为只有在这个函数才会去清掉Container。

分享到:
评论

相关推荐

    Symbian学习笔记

    1. **Symbian系统架构**:Symbian采用微内核设计,由四个主要部分组成:实时操作系统内核(OS Kernel)、运行库(Runtime Library)、中间件服务(Middleware Services)和应用程序框架(Application Framework)。...

    symbian 学习笔记

    运行时环境提供了执行应用程序的框架;中间件提供了丰富的API,使得开发者可以轻松地访问硬件资源和服务层则包含了各种系统服务,如电话管理、网络连接等。 ### 二、Symbian开发环境 开发Symbian应用通常使用 ...

    在Symbian S60系统上的语音笔记程序

    它提供了一个应用程序开发框架,包括用户界面元素和API,使得开发者可以创建丰富的移动应用。 3. **源码开发**:项目标签提到“源码”,这意味着我们可能获得的是程序的原始代码,而不是编译后的二进制文件。这对于...

    真正的Symbian笔记.docx

    Symbian系统采用分层架构,包括用户界面层(User Interface,UI)、应用程序框架层(Application Framework)、运行库层(Runtime Library)和内核层(Kernel)。这种设计使得开发者可以根据需求选择不同的组件,...

    Symbian S60实例代码

    2. **S60界面**:S60(Series 60)是Symbian OS上的一个用户界面层,提供了丰富的图形用户界面和应用程序框架。它允许开发者创建功能强大的应用程序,支持触摸和非触摸屏幕。 3. **实例代码的重要性**:学习Symbian...

    21简单GUI编程1 张锦锋Symbian讲座

    这个讲座可能是针对想要学习如何在Symbian系统上开发应用程序的开发者,特别是初学者。 【描述】中的重复内容表明这是一个系列讲座的首部分,可能涵盖了GUI编程的基础概念,以及如何在Symbian平台上搭建和设计用户...

    VideoPlayer源码

    "标签"是"symbian player",这进一步强调了我们讨论的焦点是一个Symbian平台上的视频播放器应用程序。这可能涉及到解码技术、媒体处理、用户界面设计以及Symbian系统服务的集成等关键知识点。 【压缩包内容】 虽然...

    我的Symbian编程回忆录

    接着,作者转向了QtSDK和SymbianSDK,其中Qt是一个跨平台的应用程序框架,它在SymbianSDK基础上提供了一层封装,允许开发者编写能在多个平台运行的代码。 在探索Qt的过程中,作者遇到了编译和运行问题,尤其是与...

    ReadBarC-开源

    ReadBarC是一款基于Symbian OS操作系统的开源应用程序,它专为那些配备有集成数码相机的手机设计。这款应用的核心功能是读取条形码,极大地便利了用户在购物、库存管理或产品查询等场景中的使用。只需将手机的相机...

Global site tag (gtag.js) - Google Analytics