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


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



    安平2009@原创
    qi_jianzhou@126.com

  • 相关阅读:
    从头搭建Openstack运行环境(七)--实现负载均衡与外网访问
    ML2分层端口绑定技术在SDN开发中的应用(一)
    从头搭建Openstack运行环境(六)--租户网络间路由与防火墙
    翻译校对1
    pykube-pod.obj的json字符串解析
    第一版k8s
    the server does not allow access to the requested resource
    have fun of Docker
    Clean Development Series
    Understanding the GitHub Flow官方的是最好的,永远要看第一手资料
  • 原文地址:https://www.cnblogs.com/zziss/p/1662279.html
Copyright © 2020-2023  润新知