VS2005的菜單編輯器就是這樣設(shè)計(jì)的,也就是在菜單編輯器中編輯的只是菜單的內(nèi)容,這些內(nèi)容是保存在rc文件中的,而菜單條是作為RCDATA保存在rc2資源文件中。在WM5.0中,無(wú)論是ppc中的菜單還是sp中的菜單,都是一樣的,即支持左右軟鍵,左右軟鍵分別可以彈出一個(gè)菜單。所以,微軟認(rèn)為這個(gè)東西不是菜單,是工具條,而真正的菜單是左右軟鍵彈出的那個(gè)東西。所以,在菜單編輯器中編輯的是左右軟鍵彈出的菜單,而在rc2文件中保存的是工具條的定義。
Mobile的工具條和菜單兩者是分開(kāi)來(lái)定義的,一個(gè)定義工具條(rc2),一個(gè)定義菜單(rc),所以在VS2005中除了(EVC4.0好像可以自動(dòng)創(chuàng)建)新增菜單外,還要手動(dòng)創(chuàng)建rc2文件,如果采用MFC工程,那么rc2是工程自動(dòng)產(chǎn)生,否則就要自己創(chuàng)建rc2文件。
手動(dòng)增加rc2文件如下: ///////////////////////////////////////////////////////////////////////////// // // Data // //rc2文件描述的是工具條上的兩個(gè)按鈕,并不包括彈出的菜單項(xiàng),格式如下:
//<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:整個(gè)菜單的ID //Number of buttons (1 or 2):菜單銨鈕的個(gè)數(shù),這里有兩個(gè),一個(gè)是Option,一個(gè)是About //I_IMAGENONE:SP的菜單沒(méi)有圖標(biāo)
//Cmd1ID:對(duì)應(yīng)菜單項(xiàng),如:IDR_MAIN_MENU
//Btn1State:定義是否有效,TBSTATE_ENABLED有效,無(wú)效就是TBSTATE_DISABLED了
//Btn1Style:表示是下拉菜單還是按鈕,如果是下拉菜單是TBSTYLE_DROPDOWN, //如果不是則為T(mén)BSTYLE_BUTTON,還有大小等屬性,這里的按鈕也不需要定義大小,用TBSTYLE_AUTOSIZE
//String1ID:子菜單對(duì)應(yīng)的字符串資源,菜單顯示的內(nèi)容
//Menu1Index:如果是按鈕,則用NOMENU,如果是下拉菜單, //表示了菜單項(xiàng)的序號(hào),0表示第一個(gè),1表示第二個(gè)... IDR_MAIN_MENU SHMENUBAR DISCARDABLE //整個(gè)菜單的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之后一定要加回車,否則編譯報(bào)fatal error RC1004的錯(cuò)誤 還要在RC文件中最下面增加: #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource.
如果是MFC工程,IDS_OPTION的字符串定義在資源視圖中的String Table中定義,菜單的ID最好是用系統(tǒng)的向?qū)?lái)加,手動(dòng)在resourceppc.h中定義,有時(shí)不起作用。如果我們加載的一個(gè)是菜單一個(gè)是按鈕,只要把rc2文件中菜單和按鈕兩行代碼一交換,它們?cè)诠ぞ邨l上的左右位置也就隨之交換。如果在工具條上只要一個(gè)按鈕或菜單,只要把不要的那個(gè)菜單或按鈕代碼中的IDS_OPTION項(xiàng)置為0即可。按鈕的ID可以是資源中任意按鈕的ID,如OK按鈕等。
加載菜單的代碼很多,用下面的就可以:
SHMENUBARINFO mbi;
ZeroMemory(&mbi, sizeof(SHMENUBARINFO));
mbi.cbSize = sizeof(SHMENUBARINFO);
mbi.hwndParent = this->m_hWnd;
mbi.nToolBarId = IDR_PVIEWCE_SUBMENU1;//這個(gè)ID在resourceppc.h中定義,一般要手動(dòng)加
mbi.hInstRes = ::AfxGetInstanceHandle();
if (!SHCreateMenuBar(&mbi))
return ;