给表单添加自定义菜单

今天花费了挺长时间在这个内容上,主要是因为CAknDialog这个类并没有一个明显的加载及响应菜单的方法,而且网络上面很多资料都是用了系统默认的R_AVKON_SOFTKEYS_OPTIONS_EXIT,确实算不上定制,所以现在做一个记录,希望对遇到相同问题的人能有所帮助

 

这里要实现的是左右软键以及菜单项的全部定制以及响应

 

如果表单想要的左右软件分别为"left” 和"right", left对应的菜单项包括''Command1" "Command2"。那么相关的几个文件中的代码段如下。其中省略了相关的整形和字符串值的定义。

 

1、rss文件

 

RESOURCE DIALOG r_my_dialog
 {
 flags = EEikDialogFlagNoDrag | EEikDialogFlagModeless; //自己选择
 buttons = r_my_softkeys_left_right;
 form = r_my_form;
 }

 

RESOURCE CBA r_my_softkeys_left_right

{  
    buttons =
        {  
        CBA_BUTTON { id = EMyCommandLeft; txt = string_r_my_softkey_right; },   //其中整形值和字符串自己
        CBA_BUTTON { id = EMyCommandRight; txt = string_r_my_softkey_left; }    //在hrh和rls文件中定义
        };
    }

RESOURCE MENU_BAR r_my_menubar
    {
        titles =
        {
            MENU_TITLE
            {
            menu_pane = r_my_menu_pane;
            }
        };
    }

RESOURCE MENU_PANE r_my_menu_pane

{
 items =
  {
        MENU_ITEM
         {
   command = EMyCommand1;
   txt = string_r_my_menu_command1;
         },
        MENU_ITEM
            {
   command = EMyCommand2;
   txt = string_r_my_menu_command1;
            }
        };
    }

RESOURCE FORM r_my_form
 {

……
 }

 

2、CMyForm文件

CMyForm直接继承于CAknForm。

CAknView的ConstructL()函数带了一个表示MenuBar的参数,但是在这里不需要,直接空着就好了,关键是OktoExitL 和 DynInitMenuPaneL两个函数

 

TBool CMyForm::OkToExitL( TInt aButtonId )
 {
 if( aButtonId == EMyCommandLeft )
  {
CAknDialog::DisplayMenuL();
   
  return EFalse;
  }
else if( aButtonId == EMyCommandRight ) 

 

{

……

return EFalse;

}


 return CAknDialog::OkToExitL( aButtonId );
 } 

 

这块是关键

void CMyForm::DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane )
{
    if ( aResourceId == R_AVKON_FORM_MENUPANE ) 
     {
      /* 添加菜单项*/

        aMenuPane->AddMenuItemsL( R_MY_MENU, 0 );

  

      /* 隐藏掉所有表单默认的菜单项*/
        aMenuPane->SetItemDimmed( EAknFormCmdEdit, TRUE );
        aMenuPane->SetItemDimmed( EAknFormCmdSave, TRUE );
        aMenuPane->SetItemDimmed( EAknFormCmdAdd, TRUE );
        aMenuPane->SetItemDimmed( EAknFormCmdLabel, TRUE );
        aMenuPane->SetItemDimmed( EAknFormCmdDelete, TRUE );
        }
    else
        {
     CAknForm::DynInitMenuPaneL( aResourceId, aMenuPane );
        }   
}

 

重载ProcessCommandL函数

void CMCULoginForm::ProcessCommandL( TInt aCommandId )

{

switch( aCommandId )

{

case ECommand1:  //响应菜单项Command1

……

break;

 

……

}

CAknDialog::HideMenu();

}

 

这样,一个自定义菜单的表单就实现了,希望对您有所帮助

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值