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 ;