|
小糊涂学symbian日记(2)
[OPTIONS MENUS]
Avkon菜单项是从menu bar和RSS文件中指定的menu pane resources生成的。我们可以通过windows下模拟器按F1来启动或通过options自定义功能键来启动,这是要使用EAKnSoftkeyOptions Id来实现的。如果应用程序要切换到pre-existing'options应该使用R_AVKON_SOFTKEYS_OPTIONS_BACK这个CBA资源。
每个菜单的选项都是在MENU_PANE资源结构中定义的,使用在system、application、view和context。
譬如下列菜单资源:
RESOURCE MENU_PANE r_system_menu
{
items =
{
MENU_ITEM {command = ECmdCut; txt = "Cut";},
MENU_ITEM {command = ECmdCopy; txt = "Copy";},
MENU_ITEM {command = ECmdPaste; txt = "Paste";},
};
}
子菜单和有由'cascade'参数指定,下面是一个列子
MENU_ITEM {command = ESystemOptions; txt = "System Options";
cascade = r_system_options_menu;}
顾名思义,这个就指定是了上面r_system_options_menu的子菜单。
COMBINING MENU SECTIONS
菜单sections由MENU_BAR资源来整合。按照从下到上的顺序。
一个典型的列子是
RESOURCE MENU_BAR r_menuapp_menu
{
titles =
{
MENU_TITLE { txt = "System"; menu_pane = r_system_menu;},
MENU_TITLE { txt = "App"; menu_pane = r_app_menu;},
MENU_TITLE { txt = "View"; menu_pane =
r_view1_options_menu;},
MENU_TITLE { txt = "Context"; menu_pane = r_context1_menu;},
};
}
这样就把所有的应用程序菜单列出来了。
注意txt选项只是为了识别用的,根本不显示。但还是要寸在资源文件中。
缺省的菜单栏使用EIK_APP_INFO资源,当启动时载入。如果使用的是view体系结构,那可以在view<get>AppUiFactory()->MenuBar()->SetMenuTitleResourceId(MENU_BAR_RESOURCE_ID)
每次需要改变内容时就这么做,所以你要事先把所有可能用到的菜单资源都准备好:
)
注意,如果使用的是view系统结构,那就用使用view自己的菜单系统,应如下操作
iMyView->MenuBar()->SetMenuTitleResourceId(MENU_BAR_RESOURCE_ID)
CHANGING MENU ITEMS
还可以改变个别菜单项目,这使得我们可以随时随地的添加或者是删除菜单项。
应用程序UI应该重载下列虚函数:
void DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane)
这个函数应该在什么情况下调用哪?当所有secitons已被加入到menu,menu pane object已经被建立后。
应用程序UI还可以重载下面这个虚函数:
void DynInitMenuBarL(TInt aResourceId, CEikMenuBar* aMenuBar)
Avkon滚动指示器在softky pane的中间,此外,softkey pane会因为"popped-up" controls的出现或消失而创建或注销掉。在使用滚动的controls和当前可见滚动指示器之间的通信是通过在系统中建立的CAknEnv,被softky pane和CEikScrollbarFrame使用的系统来管理的。
这个机制是对编程者隐藏的,一般来说,我们不需要担心这个scrollers。
保证正确的scrolling控制
1,Using Listboxes with CAknPopupList
void CSimpleAppUi::CreatePopupSelectionL(TInt aItems, TBool aTile)
{
CEikTextListBox* list = new(ELeave)CEikTextListBox;
CleanupStack::PushL(list);
CAknPopupList* popupList = CAknPopupList::NewL(List,
R_AVKON_SOFTKEYS_OK_BACK); //softkey pane created here
CleanupStack::PushL(popupList);
list->ConstructL(popupList, CEikListBox::ELeftDownInViewRect);
//scroller referennce fetched from (now existing) softkey pane here:
list->CreateScrollBarFrameL(ETrue);
//Set the visibility of the scrollbars (This code may become redundant)
list->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff,
CEikScrollBarFrame::EAuto);
插入代码
popupList->ExecuteLD(); //Popup selection list is put up
插入代码
CleanupStack::Pop(); //popuplist
CleanupStack::PopAndDestroy(); //list
}
其他编写知识:
1.应用程序的退出和EEIKCMDEXIT在一个Avkon程序中,有两个方法可以帮助你退出程序,一是exit菜单选项,一个就是back功能键,这两种方法有略微的差别,下面我们就来讲讲。
任何程序都可以通过调用Exit()以回应EEikCmdExit来结束程序。类似的,一些控件如dialogs,menus,popup lists等可以以此来回复escape 键的响应以便退出。
What to do
应用程序和views通过HandleCommandL()函数来处理菜单和功能键传来的命令。HandleCommandL()必须能够处理命令ID EEikCmdExit,这个是退出当前程序的信号。
对待这种情况,典型的app UI处理应该调用SaveAnyChangesL()和ExitL()。注意,如果你是写的是view体系程序,那views或app UI都可以处理这些命令,但不能同时处理这些,否则会引起问题的。
当按下back功能键时HandleCommandL()函数还会接受到EAknSoftKey这个命令ID,怎么处理这个命令要看上下文环境。但如果确实要退出,我们就要象接受到EEikCmdExit一样对待它。
功能键back可能总是产生EAknSoftkey这个ID,而菜单选项exit总上会产生EAknCmdExit命令ID,注意这个是和EEikCmdExit不同的,它是不直接使用的一般。
How it works
Exit()函数的调用将会导致当前程序的退出。如果程序是内嵌的,那控制将交到父窗口那里。在Avkon中,我们希望由back功能键来执行,但exit会导致所有窗口包括父窗口的关闭。关闭机制同样要求相关子窗口应用程序的关闭。这个是连锁反应的。如果要这样操作,可以发送给每个相关程序EEikCmdExit命令ID。因此程序在调用exit()时应该回应EEikCmdExit和EAknSoftKeyBack命令。Framework将会在检查到有EAknCmdExit时触发进程。
这就是你使用EAknCmdExit命令ID在你资源中的用处,但应该在HandlCommandL()中回应EEikCmdExit命令ID。
Dialog Shutter
应用程序的dialogs和popup窗口能够通过使用dialog shutter来关闭。 |
|