我嘗試了很多辦法,網上搜到說是用SHGetSubMenu()這個方法擷取HMENU,但是我在Aygshell.h中卻沒找到這個函數。嘗試用SHGetMenu()擷取,但是擷取出來的都是NULL。最後在網上搜到了擷取Menubar的HMENU控制代碼的方法:
首先,建立對應softkey的菜單。
SHMENUBARINFO* smb=new SHMENUBARINFO();
smb->cbSize = sizeof(SHMENUBARINFO);
smb->hInstRes = ::AfxGetInstanceHandle();
smb->hwndParent = m_hWnd;
smb->nToolBarId =IDR_DAYPLANSTART;
smb->nBmpId = 0;
smb->cBmpImages = 0;
smb->dwFlags = SHCMBF_HMENU|SHCMBF_HIDESIPBUTTON;
SHCreateMenuBar(smb);
然後,可以直接儲存控制代碼,或使用SHFindMenuBar()找出控制代碼,通過下面的方法擷取到對應的菜單控制代碼。
HWND hwndMB=smb->hwndMB;
TBBUTTONINFO tbbi={0};
tbbi.cbSize=sizeof(tbbi);
tbbi.dwMask=TBIF_LPARAM|TBIF_BYINDEX;
::SendMessage(hwndMB,TB_GETBUTTONINFO,0,(LPARAM)&tbbi);
HMENU m_hMenuBar=(HMENU)tbbi.lParam;
最後,使用菜單控制代碼對裡面的功能表項目進行修改。
TCHAR szDrawText[100];
wcscpy(&szDrawText[0],sChangeText);sChangeText是CString類型,注意長度不要超過szDrawText定義的長度。
MENUITEMINFO mii;
memset((char *)&mii, 0, sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_TYPE;
mii.dwTypeData = &szDrawText[0];
mii.cch = 100;
mii.fType =MFT_STRING;
GetMenuItemInfo(m_hMenuBar, ID_TAKEPHOTO, FALSE, &mii);//擷取功能表項目資訊
SetMenuItemInfo(m_hMenuBar, ID_TAKEPHOTO, FALSE, &mii);//設定功能表項目資訊
ID_TAKEPHOTO是功能表項目的ID