UIDesigner中的Form界面中如何添加一个menubar来替换Control Pane

guirenwang 2008-10-11 11:12:46
大家好,我是一个刚刚接触Symbian的新手,我在使用Carbide.c++的时候要在一个Form的界面中添加一个menubar来进行后续的操作,于是Carbide的下面的problems里面就有一个提示是Info类型的:Menubars added to Avkon views containing a Form will not automatically replace the Form's default options menu. Handwritten code must be added to replace the options menu of a Form.可是我就是不知道从哪里改,我到我的一个相应的资源文件中改
RESOURCE AVKON_VIEW r_fmofor_symbian_index_form_fmofor_symbian_index_form_view
{
cba = R_AVKON_SOFTKEYS_OPTIONS_EXIT;
menubar = r_fmofor_symbian_index_form_imbindex;
toolbar = 0;
}
(原本这个函数默认系统生成时是空的)
同时我还查到DynInitMenuPaneL函数要进行修改,可是我不知道怎么改,希望高手多多指点。
...全文
417 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
hengxf 2009-11-22
  • 打赏
  • 举报
回复
我也遇到这个问题,我在mViewTestForm.cpp里面的CMViewTestForm::NewLC中把self->ConstructL();
改为self->ConstructL(R_NEW_MENU_BAR);但是编译报错,错误为undefined identifier 'R_NEW_MENU_BAR'
anel 2008-10-14
  • 打赏
  • 举报
回复
可参考:
2nd example Series60Ex\form
3rd example S60Ex\PopupField
dmzy1984 2008-10-14
  • 打赏
  • 举报
回复
我试了下,可以啊。

你用这个了吗?

void CSomeTestQueryForm::ProcessCommandL(TInt aCommandId)
guirenwang 2008-10-14
  • 打赏
  • 举报
回复
新问题出现,我的那个MenuBar中虽然出现了我要的Item,但是我在选择的时候却不能触发事件,
怎么这个帖子不见了。。。。郁闷。。。
guirenwang 2008-10-14
  • 打赏
  • 举报
回复
终于可以了,我采用的是dmzy1984的第二种方法,是将NewLC()的构造函数self->ConstructL(R_AVKON_NEW_MENU);中做的改变,至于dmzy1984说的那些菜单都出来的方法,我是在DynInitMenuPaneL()函数中将它的四个command全都设为SetItemDimmed,默认三个都已经设了,剩下最后一个(头文件显示好像有7个,但是默认显示的好像就这四个)EAknFormCmdSave也不他设为ETrue,这样你就可以自定义菜单了。
最后,结贴感谢各位对小弟的帮助。
dmzy1984 2008-10-13
  • 打赏
  • 举报
回复
CAknForm::DynInitMenuPaneL(aResourceId, aMenuPane)
这个函数是在你每次加载菜单前对菜单进行的一些初始化工作,
上面代码中首先判断了所加载的菜单是资源中的那一个,
对相应的菜单进行 菜单项的SetDimmed等操作。

按你的说法,
你是想把Form里默认的这个菜单R_AVKON_FORM_MENUPANE 给完全换掉,
我觉得似乎可以有两种做法:
1 。按照
// sample code to add a custom item with command id 'myCommandId'
TInt pos;
if ( !aMenuPane->MenuItemExists( myCommandId, pos ) )
{
CEikMenuPaneItem::SData menuItem;
menuItem.iCommandId = myCommandId;
menuItem.iCascadeId = 0; // set for submenus
menuItem.iFlags = 0; // e.g. EEikMenuItemDimmed
menuItem.iText = KMyCommandIdText;
menuItem.iExtraText = _L("");
aMenuPane->AddMenuItemL( menuItem );
}
把你的菜单项都放进R_AVKON_FORM_MENUPANE里,
然后通过 aMenuPane->SetItemDimmed(EAknFormCmdAdd, ETrue);
这种操作把R_AVKON_FORM_MENUPANE里你不想要的菜单项给 setdimmed了。

2. 在资源中增加一个 R_AVKON_NEW_MENU,

CAknForm中有个方法:
ConstructL (TInt aMenuBarId=0)
在自动生成的代码中这个地方直接用了 self->ConstructL();

刚试着把它改为 self->ConstructL(R_AVKON_NEW_MENU);

进入Form后发现弹出菜单中竟然把我的 r_avkon_NEW_MENU 菜单和R——AVKON—Form_menubar里的内容和起了来,
有点想不通,
正在进一步实验。
anel 2008-10-13
  • 打赏
  • 举报
回复
按照一般视图添加菜单就可以了
RSS文件:
RESOURCE AVKON_VIEW r_fmofor_symbian_index_form_fmofor_symbian_index_form_view
{
cba = R_AVKON_SOFTKEYS_OPTIONS_EXIT;
menubar = r_fmofor_symbian_index_form_imbindex;
toolbar = 0;
}
RESOURCE MENU_BAR r_fmofor_symbian_index_form_imbindex
{
titles =
{
MENU_TITLE { menu_pane = r_menupane_view;}//假设定义为r_menupane_view
};
}
RESOURCE MENU_PANE r_menupane_view
{
items =
{
MENU_ITEM { command = ECmdText; txt = str1; }, //手工修改
MENU_ITEM { command = EAknCmdExit; txt = str2; }
};
}

rls文件:
#define str1 "测试"
#define str2 "退出"
guirenwang 2008-10-13
  • 打赏
  • 举报
回复
补充下,不知道我所修改的那个资源文件是否正确。
guirenwang 2008-10-13
  • 打赏
  • 举报
回复
谢谢楼上再一次的帮助,
我基础太差,楼上说的方法我不是很理解。
您提出的下面的两种改法是在上面所提到的注释里面改还是怎么改,能否说得再详细点。
谢谢,为答谢你的多次帮助,我给帖子加分。
dmzy1984 2008-10-13
  • 打赏
  • 举报
回复
To guirenwang:

aMenuPane->AddMenuItemL我也刚试了一下,
发现确实不知怎的冒出好几个一样的MenuItem。

方法二我试过确实能添加菜单项,但存在的问题还没解决。

共同学习之
guirenwang 2008-10-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 dmzy1984 的回复:]
CAknForm::DynInitMenuPaneL(aResourceId, aMenuPane)
这个函数是在你每次加载菜单前对菜单进行的一些初始化工作,
上面代码中首先判断了所加载的菜单是资源中的那一个,
对相应的菜单进行 菜单项的SetDimmed等操作。

按你的说法,
你是想把Form里默认的这个菜单R_AVKON_FORM_MENUPANE 给完全换掉,
我觉得似乎可以有两种做法:
1 。按照
// sample code to add a custom item with command id 'myCommandId'
TInt po…
[/Quote]你的第一种方法我试了,我的方法是menuItem.iText = KMyCommandIdText; 前面加了一句——LIT(KMyCommandIdText,"Login"),Build project后发现我的模拟器上竟然有四个Login。
第二种方法暂时还没有试,多谢你对我的帮助。
guirenwang 2008-10-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 anel 的回复:]
按照一般视图添加菜单就可以了
RSS文件:
RESOURCE AVKON_VIEW r_fmofor_symbian_index_form_fmofor_symbian_index_form_view
{
cba = R_AVKON_SOFTKEYS_OPTIONS_EXIT;
menubar = r_fmofor_symbian_index_form_imbindex;
toolbar = 0;
}
RESOURCE MENU_BAR r_fmofor_symbian_index_form_imbindex
{
titles =
{
MENU_TITLE { menu_pane = r_menupane_view;}//假设定义为r_menupane_view
};
}
RESOURCE MENU_PANE r_…
[/Quote]
我仔细对照了我的资源文件,和你写的格式完全一样,所以还是谢谢你。
dmzy1984 2008-10-11
  • 打赏
  • 举报
回复
自动生成的Form代码里的DynamicMenuPaneL中不是有这些嘛
	
CAknForm::DynInitMenuPaneL(aResourceId, aMenuPane);

if (aResourceId == R_AVKON_FORM_MENUPANE)
{
aMenuPane->SetItemDimmed(EAknFormCmdAdd, ETrue);
aMenuPane->SetItemDimmed(EAknFormCmdLabel, ETrue);
aMenuPane->SetItemDimmed(EAknFormCmdDelete, ETrue);

/*
// sample code to add a custom item with command id 'myCommandId'
TInt pos;
if ( !aMenuPane->MenuItemExists( myCommandId, pos ) )
{
CEikMenuPaneItem::SData menuItem;
menuItem.iCommandId = myCommandId;
menuItem.iCascadeId = 0; // set for submenus
menuItem.iFlags = 0; // e.g. EEikMenuItemDimmed
menuItem.iText = KMyCommandIdText;
menuItem.iExtraText = _L("");
aMenuPane->AddMenuItemL( menuItem );
}
*/


貌似带着一个菜单R_AVKON_FORM_MENUPANE,里面有Add、Label、Delete、Change几个菜单项,
而ADD、Label、Delete在上面的代码中被SetDimmed了。
如果要添加自定义的菜单项,下面不是有一段 sample code to add a custom item with command id 嘛?
这个应该可以吧。

至于完全更改:
更改CBA(其中R_AVKON_SOFTKEYS_OPTIONS_BACK__SELECT是系统定义的,也可以是自定义的)
CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current();
cba->SetCommandSetL( R_AVKON_SOFTKEYS_OPTIONS_BACK__SELECT );
cba->DrawNow();

更改菜单(R_SOME_TEST_SETTING_SELECT_MENU_BAR1 ,新的菜单ID):
MenuBar()->SetMenuTitleResourceId(R_SOME_TEST_SETTING_SELECT_MENU_BAR1);
MenuBar()->DrawNow();

这两个我在CAknView里都用过,可以实现,
不知道在Form里行不行。
应该也行吧?
你可以试一试。

3,120

社区成员

发帖
与我相关
我的任务
社区描述
塞班系统(Symbian系统)是塞班公司为手机而设计的操作系统,它的前身是英国宝意昂公司的 EP ( Electronic Piece of cheese)操作系统。
社区管理员
  • Symbian社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧