您的位置:首页 > 其它

给表单添加自定义菜单

2010-04-22 22:57 459 查看
今天花费了挺长时间在这个内容上,主要是因为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();

}

这样,一个自定义菜单的表单就实现了,希望对您有所帮助
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: