symbian 菜单-运行时更换菜单实现右键菜单功能

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
{
 titles=
 {
  MENU_TITLE {menu_pane=r_content_item;txt="";}
 };
}
RESOURCE MENU_PANE r_content_item
{
 items=
 {
  MENU_ITEM{command=EContentMCmdDeleteGameLevel;txt=qtn_app_deleteGameLevel;},
  MENU_ITEM{command=EContentMCmdPlayGameLevel;txt=qtn_app_playGameLevel;}
 };
}

RESOURCE LISTBOX r_listbox
{
    array_id = r_levelItem;
 flags = EAknListBoxSelectionList;

}

RESOURCE ARRAY r_levelItem
{
 items=
 {          
  LBUF{txt=qtn_app_level1;},
  LBUF{txt=qtn_app_level2;},
  LBUF{txt=qtn_app_level3;},
  LBUF{txt=qtn_app_level4;},
  LBUF{txt=qtn_app_level5;},
  LBUF{txt=qtn_app_level6;},
  LBUF{txt=qtn_app_level7;},
  LBUF{txt=qtn_app_level8;},
  LBUF{txt=qtn_app_level9;}
 };
}

 

HRH 文件代码

enum TGameCmdIds
{
 EContentMCmdDeleteGameLevel=2,
 EContentMCmdPlayGameLevel
};

LOC 文件代码

#define qtn_app_deleteGameLevel "delete level"
#define qtn_app_playGamelevel   "play level"

#define qtn_app_level1 "/tlevel 1"
#define qtn_app_level2 "/tlevel 2"
#define qtn_app_level3 "/tlevel 3"
#define qtn_app_level4 "/tlevel 4"
#define qtn_app_level5 "/tlevel 5"
#define qtn_app_level6 "/tlevel 6"
#define qtn_app_level7 "/tlevel 7"
#define qtn_app_level8 "/tlevel 8"
#define qtn_app_level9 "/tlevel 9"

 

将文件都配置好后,该添加代码了
Container文件

#include "ContentMContainer.h"


#include "ContentM.RSG"
#include <EIKENV.H>
#include <barsread.h>
#include <aknlists.h>
#include <eikmenub.h>
#include <uikon.hrh>

// ================= MEMBER FUNCTIONS =======================

// ---------------------------------------------------------
// CContentMContainer::ConstructL(const TRect& aRect)
// EPOC two phased constructor
// ---------------------------------------------------------
//
void CContentMContainer::ConstructL(const TRect& aRect)
    {
    CreateWindowL();

 iSaveLevel = new(ELeave)CAknSingleStyleListBox;
 iSaveLevel->SetContainerWindowL(*this);

 TResourceReader reader;
 CEikonEnv::Static()->CreateResourceReaderLC(reader,R_LISTBOX);
    iSaveLevel->ConstructFromResourceL(reader);
 CleanupStack::PopAndDestroy();
    SetRect(aRect);
    ActivateL();
    }

// Destructor
CContentMContainer::~CContentMContainer()
    {
  delete iSaveLevel;
    }

// ---------------------------------------------------------
// CContentMContainer::SizeChanged()
// Called by framework when the view size is changed
// ---------------------------------------------------------
//
void CContentMContainer::SizeChanged()
    {
    // TODO: Add here control resize code etc.
    iSaveLevel->SetExtent(TPoint(0,0),iSaveLevel->MinimumSize());
    }

// ---------------------------------------------------------
// CContentMContainer::CountComponentControls() const
// ---------------------------------------------------------
//
TInt CContentMContainer::CountComponentControls() const
    {
    return 1; // return nbr of controls inside this container
    }

// ---------------------------------------------------------
// CContentMContainer::ComponentControl(TInt aIndex) const
// ---------------------------------------------------------
//
CCoeControl* CContentMContainer::ComponentControl(TInt aIndex) const
    {
    switch ( aIndex )
        {
        case 0:
            return iSaveLevel;
      
        default:
            return NULL;
        }
    }

// ---------------------------------------------------------
// CContentMContainer::Draw(const TRect& aRect) const
// ---------------------------------------------------------
//
void CContentMContainer::Draw(const TRect& aRect) const
    {
    CWindowGc& gc = SystemGc();
 //gc.Clear(aRect);
    // TODO: Add your drawing code here
    // example code...
    gc.SetPenStyle( CGraphicsContext::ENullPen );
    gc.SetBrushColor( KRgbGray );
    gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
 
    //gc.DrawRect( aRect );
    }

// ---------------------------------------------------------
// CContentMContainer::HandleControlEventL(
//     CCoeControl* aControl,TCoeEvent aEventType)
// ---------------------------------------------------------
//
void CContentMContainer::HandleControlEventL(
    CCoeControl* /*aControl*/,TCoeEvent /*aEventType*/)
    {
    // TODO: Add your control event handler code here
    }

void CContentMContainer::DeleteGameLevel()
{
 if (iSaveLevel)
 {
  CTextListBoxModel* model = iSaveLevel->Model();
  if (model->NumberOfItems()>0)
  {
   MDesCArray* itemList = model->ItemTextArray();
   CDesCArray* itemArray = STATIC_CAST(CDesCArray*,itemList);

   TInt currentItem = iSaveLevel->CurrentItemIndex();
   itemArray->Delete(currentItem);
   AknListBoxUtils::HandleItemRemovalAndPositionHighlightL(iSaveLevel,currentItem,ETrue);

   iSaveLevel->DrawNow();
  }
 }
}

void CContentMContainer::PlayGameLevel()
{
 
}

TKeyResponse CContentMContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent,TEventCode aType )
{
 //TBool isClickOk = ((aKeyEvent.iCode == EKeyDevice3) && (aType==EEventKey));
 TBool isClickOk = ((aKeyEvent.iCode == EKeyOK) && (aType==EEventKey));
 TBool ListBoxNotEmpty = (iSaveLevel) && (iSaveLevel->Model()->NumberOfItems());

 if ( isClickOk && ListBoxNotEmpty)
 {
  CEikMenuBar* bar = iEikonEnv->AppUiFactory()->MenuBar();
  bar->SetMenuTitleResourceId(R_CONTENT_MENU);
  if (bar)
  {
   bar->TryDisplayMenuBarL();
  }
  bar->SetMenuTitleResourceId(R_CONTENTM_MENUBAR);
  return EKeyWasConsumed;
 } else
  return iSaveLevel->OfferKeyEventL(aKeyEvent,aType);
}
// End of File

 


红色部分是主要代码

头文件很简单就多了一句

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 时再来看就应该理解了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值