Benjamin

静以修身,俭以养德,非澹薄无以明志,非宁静无以致远。
随笔 - 345, 文章 - 0, 评论 - 196, 引用 - 0
数据加载中……

WM5.0中的自定义菜单

VS2005的菜单编辑器就是这样设计的,也就是在菜单编辑器中编辑的只是菜单的内容,这些内容是保存在rc文件中的,而菜单条是作为RCDATA保存在rc2资源文件中。在WM5.0中,无论是ppc中的菜单还是sp中的菜单,都是一样的,即支持左右软键,左右软键分别可以弹出一个菜单。所以,微软认为这个东西不是菜单,是工具条,而真正的菜单是左右软键弹出的那个东西。所以,在菜单编辑器中编辑的是左右软键弹出的菜单,而在rc2文件中保存的是工具条的定义。


Mobile的工具条和菜单两者是分开来定义的,一个定义工具条(rc2),一个定义菜单(rc),所以在VS2005中除了(EVC4.0好像可以自动创建)新增菜单外,还要手动创建rc2文件,如果采用MFC工程,那么rc2是工程自动产生,否则就要自己创建rc2文件。
手动增加rc2文件如下:     /////////////////////////////////////////////////////////////////////////////     //     //   Data     //         //rc2文件描述的是工具条上的两个按钮,并不包括弹出的菜单项,格式如下:    
//<Menu   ID>,   <Number   of   buttons   (1   or   2)>,     //I_IMAGENONE,   <Cmd1ID>,   <Btn1State>,   <Btn1Style>,   <String1ID>,   0,   <Menu1Index>     //I_IMAGENONE,   <Cmd2ID>,   <Btn2State>,   <Btn2Style>,   <String2ID>,   0,   <Menu2Index>        
//Menu   ID:整个菜单的ID     //Number   of   buttons   (1   or   2):菜单铵钮的个数,这里有两个,一个是Option,一个是About     //I_IMAGENONE:SP的菜单没有图标    
//Cmd1ID:对应菜单项,如:IDR_MAIN_MENU    
//Btn1State:定义是否有效,TBSTATE_ENABLED有效,无效就是TBSTATE_DISABLED了    
//Btn1Style:表示是下拉菜单还是按钮,如果是下拉菜单是TBSTYLE_DROPDOWN,     //如果不是则为TBSTYLE_BUTTON,还有大小等属性,这里的按钮也不需要定义大小,用TBSTYLE_AUTOSIZE    
//String1ID:子菜单对应的字符串资源,菜单显示的内容        
//Menu1Index:如果是按钮,则用NOMENU,如果是下拉菜单,     //表示了菜单项的序号,0表示第一个,1表示第二个...         IDR_MAIN_MENU   SHMENUBAR   DISCARDABLE   //整个菜单的ID     BEGIN     IDR_MAIN_MENU,   2,         I_IMAGENONE,   IDR_MAIN_MENU,   TBSTATE_ENABLED,   TBSTYLE_DROPDOWN   |   TBSTYLE_AUTOSIZE,     IDS_OPTION,   0,   0,         I_IMAGENONE,   IDM_ABOUT,   TBSTATE_ENABLED,   TBSTYLE_BUTTON   |   TBSTYLE_AUTOSIZE,             IDS_ABOUT,   0,   NOMENU,     END    
//END之后一定要加回车,否则编译报fatal   error   RC1004的错误                 还要在RC文件中最下面增加:     #ifndef   APSTUDIO_INVOKED     /////////////////////////////////////////////////////////////////////////////     //     //   Generated   from   the   TEXTINCLUDE   3   resource.  
如果是MFC工程,IDS_OPTION的字符串定义在资源视图中的String Table中定义,菜单的ID最好是用系统的向导来加,手动在resourceppc.h中定义,有时不起作用。如果我们加载的一个是菜单一个是按钮,只要把rc2文件中菜单和按钮两行代码一交换,它们在工具条上的左右位置也就随之交换。如果在工具条上只要一个按钮或菜单,只要把不要的那个菜单或按钮代码中的IDS_OPTION项置为0即可。按钮的ID可以是资源中任意按钮的ID,如OK按钮等。
加载菜单的代码很多,用下面的就可以:
SHMENUBARINFO mbi;
 ZeroMemory(&mbi, sizeof(SHMENUBARINFO));
 mbi.cbSize      = sizeof(SHMENUBARINFO);
 mbi.hwndParent  = this->m_hWnd;
 mbi.nToolBarId  = IDR_PVIEWCE_SUBMENU1;//这个ID在resourceppc.h中定义,一般要手动加
 mbi.hInstRes    = ::AfxGetInstanceHandle();

 if (!SHCreateMenuBar(&mbi))
  return ;

posted on 2008-12-14 20:25 Benjamin 阅读(785) 评论(1)  编辑 收藏 引用 所属分类: PDA/PPC开发

评论

# re: WM5.0中的自定义菜单  回复  更多评论   

哈哈,内容不错,正解决这个问题呢
2010-04-29 17:15 | housan321

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理