Symbian 入门
为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?
如果你的应
Symbian 相关文章:
- 手机操作系统Symbian系介绍(05-23)
- Symbian 摄像头编程预研(10-08)
- symbian 术语表(10-10)
- 学习Symbian的基本概念(09-12)
- SYMBIAN 字符串操作(09-12)
- 什么是Symbian(09-12)