symbian菜单2-运行时更换菜单实现右键菜单功能
symbian 菜单主要是由 MENU_BAR->MENU_TITLE->MENU_PANE->MENU_ITEM 组成
MENU_BAR的属性 titles 指定 MENU_TITLE的集合
MENU_TITLE的 menu_pane 指定这个 MENU_TITLE 由哪个 MENU_PANE 提供菜单项
MENU_PANE 的 items 指定了菜单的集合,这些集合是由 MENU_ITEM 组成
MENU_ITEM 中 command 是菜单命令的 id ,txt 是菜单显示文本,cascade 是指关联的子菜单的 MENU_PANE
把菜单添加到 系统的菜单中是在
RESOURCE EIK_APP_INFO
{ hotkeys = r_contentm_hotkeys; menubar = r_contentm_menubar; cba = R_AVKON_SOFTKEYS_OPTIONS_BACK; } |
中 的 menubar 中添加
现在的问题是如何在运行时可以改变这个菜单,让菜单自已去显示出来呢,得到当前菜单是通过
CEikMenuBar* bar = iEikonEnv->AppUiFactory()->MenuBar();
|
得 到了这个 bar ,则可以通过下面的方法来手动加载一个菜单,如以下代码
bar->SetMenuTitleResourceId(R_CONTENT_MENU);
if (bar) { bar->TryDisplayMenuBarL(); } bar->SetMenuTitleResourceId(R_CONTENTM_MENUBAR); |
SetMenuTitleResourceId 是通过加载一个资源号去加载一个菜单,加载完后通过 TryDisplayMenuBar() 来显示这个菜单,当菜单使用完毕后,通过 SetMenuTitleResourceId()再去加载默认的菜单,这样就可以动态改变这个菜单,也可以实现一种右键菜单的效果
通过菜单的练习也学到了怎么使用 Listbox ,不过还不是很清楚,以下全部的代码(代码只列出自己写的,系统自动生成的没有列出)
RSS 文件代码
RESOURCE MENU_BAR r_content_menu RESOURCE LISTBOX r_listbox } RESOURCE ARRAY r_levelItem |
HRH 文件代码
enum TGameCmdIds
{ EContentMCmdDeleteGameLevel=2, EContentMCmdPlayGameLevel }; |
LOC 文件代码
#define qtn_app_deleteGameLevel "delete level" #define qtn_app_level1 "/tlevel 1" |
将文件都配置好后,该添加代码了
Container文件
#include "ContentMContainer.h"
// ================= MEMBER FUNCTIONS ======================= // --------------------------------------------------------- iSaveLevel = new(ELeave)CAknSingleStyleListBox; TResourceReader reader; // Destructor // --------------------------------------------------------- // --------------------------------------------------------- // --------------------------------------------------------- // --------------------------------------------------------- // --------------------------------------------------------- void CContentMContainer::DeleteGameLevel() TInt currentItem = iSaveLevel->CurrentItemIndex(); iSaveLevel->DrawNow(); void CContentMContainer::PlayGameLevel() TKeyResponse CContentMContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent,TEventCode aType ) if ( isClickOk && ListBoxNotEmpty) |
红色部分是主要代码
头文件很简单就多了一句
CEikTextListBox* iSaveLevel;
|
对于菜单的处理通过 AppUI来处理
在AppUI 的 HandleCommand 中处理
void CContentMAppUi::HandleCommandL(TInt aCommand) { switch ( aCommand ) { case EAknSoftkeyBack: case EEikCmdExit: { Exit(); break; } case EContentMCmdAppTest: { iEikonEnv->InfoMsg(_L("test")); break; } // TODO: Add Your command handling code here case EContentMCmdDeleteGameLevel: { iAppContainer->DeleteGameLevel(); break; } case EContentMCmdPlayGameLevel: { iAppContainer->PlayGameLevel(); break; } default: break; } |
红色部分是处理菜单的,对于删除选择的 ListBox项,还不太明白,等学到 listbox 时再来看就应该理解了