如何设计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()提供了许多功能供使用.
啰啰嗦嗦写了一大堆!
感觉好乱,想到哪就写到哪!
要用的时候再来查吧!
本文地址:http://www.45fan.com/a/question/72578.html