如何设计Symbian应用程序UI架构?

如何设计Symbian应用程序UI架构?

用于应用程序UI的3种常见应用程序架构有:

1.基于控件的传统Symbian OS架构

AppUi直接拥有视图控件,控件继承自CCoeControl,需要自己去完成

void SizeChanged();

TInt CountComponentControls() const;

CCoeControl* ComponentControl(TInt aIndex) const;

void Draw(const TRect& aRect) const;等函数

还可自定义virtual TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,
TEventCode aType);等函数

如果需要使用到多个视图,则可以使用AddtoStackL()和RemoveFromStackL()在不同的视图之间切换

最后加入到Stack中的那个控件在最上面,拥有程序的焦点,即可以捕捉键盘按键消息

可以通过 MakeVisible( EFalse/ETrue);来控制在最顶上的控件是否显示,如最顶上的控件设置为不显示

则用户看到的是次顶层的控件,依次类推,但是MakeVisible不会改变程序的焦点,焦点仍然在最顶层控件上

2.基于对话框的架构

其实是上一种架构的一个特例,可以省去很多实现,使用默认的Dialog的架构

当需要增加一个简单的视图时可使用无模式的Dialog,也可以就使用一个模式Dialog

将控件放在里面.执行完后即退出(如简单的设置属性的对话框)

动态改变Dialog里面控件的初始值:

在PreLayoutDynInitL()中使用Control() 或ControlOrNull()+ 控件ID 获得控件,并修改其属性

自定义控件:

只需要在资源文件将控件的type设置为一个非系统的资源type,然后在

CreateCustomControlL()中创建该控件即可,其他地方和普通系统控件无差别.

(CreateCustomControlL 中用到的结构体 SEikControlInfo的 iFlags有时设置为0,

有时设置为 EEikControlHasEars 二者有何差别沿不清楚)

对话框中动态增加控件(需使用简单的资源文件):

使用InsertLineL(),同时还可能用到的函数有TryChangeFocusToL()使增加的控件获得焦点

资源文件示例:

RESOURCE DLG_LINE r_eikline {
type=EEikCtEdwin;
prompt="New Line";
id=32777;
control=EDWIN { width=10; maxlength=8;};
}

动态增加控件的另一种方法(完全不使用资源文件):

使用CreateLineByTypeL ()

3 AVkon视图切换架构

采用了所谓的MVC(Mode_View_Controller)设计模式

其中Mode,View,Controller封闭应用程序的不同部分,可分别对应Document,View,UI.

Mode主要用来储存数据,并封装对数据的操作。

View负责显示,并将用户输入发送给Controller

Controller定义程序的行为,将用户的动作映射为Mode的更新.

对多视图的程序,Controller还要进行View的选择和管理。

一般在实际应用中一个View对应一个Controller,但也可以是多个View对应一个Controller.

应用程序一般如此组织:

首先,定义一个继承自CAknViewAppUi的AppUi,在其 Contruct的时候便new出所要用到的各个View

并将其ownership转交给CAknViewAppUi,然后指定一个默认的View,程序加载的时候就会先加载这个

默认的View.

其次, 在View DoActivateL的时候new 其对应的Container 并通过AppUi()->AddToStackL将

Container加载到Stack的顶部,使其拥有程序焦点,可以获得用户的输入.

相应的,在DoDeactivate的时候,执行DoActivateL时的反操作

再次, 在Container Contruct时new Mode.

在View 的HandleCommandL中处理用户的各个菜单命令,DynInitMenuPaneL中动态改变菜单

并且可以重写Container的OfferKeyEventL()以获取用户的键盘输入.

View中可以使用AppUi()将命令传递给AppUi来处理.

亦可使用全局的iAvkonViewAppUi来获得AppUi(不太好,尽量少用)

CCoeEnv::Static()提供了许多功能供使用.

 

啰啰嗦嗦写了一大堆!

感觉好乱,想到哪就写到哪!

要用的时候再来查吧!