微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Symbian 入门

Symbian 入门

时间:09-12 来源:互联网 点击:

为HandleForegroundEvent (EFalse),只有当前台状态确实改变时这个函数才会

被调用。

HandleCommandL()

当view菜单产生一个命令后本函数将被调用。

HandleStatusPaneSizeChange()

当client的尺寸由于status pane而改变时,本函数被调用了就。

下面是一个view在接受事件的典型调用顺序

1.DoActivateL()

2.HandleForegroundEventL(ETrue)

3.HandleForegroundEventL(EFalse)

4.DoDeactivate()

其中一对HandleForegrounEventL在view被激活的过程中会发生多次调用。

而DoActivateL()在DoDeactivate()被调用前可能会被多次调用。

View Resources

如果你要使用view来显示pages,那唯一的途径是创建出自己的AVKON_VIEW资源,里面有自己的CBA和菜单,把这个资源的id传递给view的

BaseContructL()函数即可。

RESOURCE AVKON_VIEW r_viewapp_view1

{

hotkeys = r_viewapp_hotkeys;

menubar = r_viewapp_view1_menubar;

cba = R_AVKON_SOFTKEYS_OPTIONS_BACK;

}

注意如果没有给定的menubar资源,那就会使用确省的系统menubar

Construction

下面这个例程是用的AppUI object's ConstructL来构造出view的,使用了AddView来登记,最后把第一个创建的view做为缺省的view了:

void CMyViewArchAppUi::ConstructL()

{

BaseConstructL();

CMyViewArchAppView1* view1 = new(ELeave) CMyViewArchAppView1;

CleanupStack::PushL(view1);

view1->ConstructL();

AddViewL(view1); //Add view1 to CAknAppUi; transfers ownership

CleanupStack::Pop();

CMyViewArchAppView2* view2 = new(ELeave) CMyViewArchAppView2;

AddViewL(View2); // transfer ownership to CAknAppUi

CleanupStack::Pop();

CMyViewArchAppView3* view3 = new(ELeave) CMyViewArchAppView3;

AddViewL(View2); // transfer ownership to CAknAppUi

CleanupStack::Pop();

SetDefaultViewL(*view1);

.......(more code)

要让view发挥作用(注意,一个view自身是没有绘图能力的),它必须拥有得到一个从CCoeControl派生的containers,譬如

class CMyViewArchAppView1Container: public CCoeControl, MCoeControlObserver

下面这个例程将展现编程者自己的CAknView派生类

class CMyViewArchAppView1: public CAknVIew

{

.....

private:

CMyViewArchAppView1Container* iVIew;

}

大家可以看出App里产生了View,View类中有我们必须的Container.

当前激活的view在HandleCommandL()处理命令,这些是自定义功能键和菜单所生成的命令。

void CMyAppView1::HandleCommandL(TInt aCommand)

{

switch (aCommand)

{

case EMyAppCmdSwitchView:

AppUi()->ActivateLocalViewL(KView2Id);

break;

case EAknSoftKeyOk:

{

......

break;

}

case EAknSoftKeyBack:

{

((MEikCommandObserver*)AppUi())->ProcessCommandL(EEikCmdExit);

break;

}

default:

AppUi()->HandleCommandL(aCommand);

break;

}

}

Local View Switching

如果你要切换view,你得提供view的UID

//Now switch the view to view2

iAvkonViewAppUi->ActivateLocalViewL(TUid::Uid(2));

事实上,每个view都有自己的菜单系统,如果你要使用它,应当在AVKON_VIEW资源结构中设置,前面已经讲过了。

而且不管怎么说,如果要使用系统菜单,它的内容在切换之前是一定要更新一次的。

//Switch to a new menu system for the new view

iEikonEnv->AppUiFactory()->MenuBar()->SetMenuTitleResourceId(R_MY_VIEW_ARCH_APP_VIEW2_MENU);

//Now swtich the view to view2

如果要进行远程的视图切换,那就要调用CCoeAppUi::ActivateViewL()函数,并传递了一个包含目标应用程序UID和目标视图UID的TVwsViewId

Leave recovery

Avkon 视图体系结构在DoActivateL()退出时会有个自动的回复机制。系统会调用DoDeactivate()在当前view离去时,回复前一个 view,并把

用户带到之前他们所在的地方。如果程序并没有前一个view的存在,那它就会退出,如果程序前个view就是当前的view(也就是说他们 是重激

活的),则应用程序会试图恢复缺省的view.

说了这么多,那我们在什么情况下采用合适的体系结构那?下面的内容将会有所帮助。

使用传统的SymbianOS体系结构,你要花费大量的时间研究代码是怎么工作的,但大部分交互和错误处理的引擎代码都是现成,可以降低你的开

发难度。

Do you have an acyclic graph shaped navigation structure?

如果你视图程序中的navigation能够as an acyclic gragh,那最好使用dialog体系结构。

Are all the application screens dialog like?

如果你的应

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top