1、创建并显示菜单,先在资源里添加菜单,然后如下代码
SHMENUBARINFO mbi;
ZeroMemory(&mbi, sizeof(SHMENUBARINFO));
mbi.cbSize = sizeof(SHMENUBARINFO);
mbi.hwndParent = m_hWnd;
mbi.hInstRes = ::AfxGetInstanceHandle();
mbi.dwFlags = SHCMBF_HMENU | SHCMBF_HIDESIPBUTTON; // 隐藏SIP
mbi.nToolBarId = IDR_MYMENU;
SHCreateMenuBar(&mbi);
2、隐藏菜单
HWND hwnd = ::SHFindMenuBar(m_hWnd);
if(hwnd != NULL)
::ShowWindow(hwnd, SW_HIDE);
3、隐藏某个子菜单
HMENU hMenu = NULL;
TBBUTTONINFO tbbi = {0};
tbbi.cbSize = sizeof(TBBUTTONINFO);
tbbi.dwMask = TBIF_LPARAM | TBIF_BYINDEX;
::SendMessageW(mbi.hwndMB, TB_GETBUTTONINFO, 1, (LPARAM)&tbbi); // 0为SoftKey1,1为SoftKey2
hMenu = (HMENU)tbbi.lParam;
EnableMenuItem(hMenu, IDM_TEST, MF_GRAYED); // 隐藏子菜单
EnableMenuItem(hMenu, IDM_TEST, MF_ENABLED); // 显示子菜单
4、使某个SoftKey不可用
::SHEnableSoftkey(mbi.hwndMB, 0, TRUE, FALSE);
如果命令栏是使用MFC方式创建的,这里的mbi.hwndMB可以使用CCommandBar类型成员变量m_dlgCommandBar.m_hWnd代替。
5、动态修改菜单
ModifyMenu(hMenu, IDM_TEST, MF_DISABLED | MF_STRING, IDM_TEST, L"修改后的文字");
InsertMenu(hMenu, beforeItem, MF_BYCOMMAND, afterItem, L”新增加的菜单”); // 加入含有欲改写文本的菜单项
DeleteMenu(hMenu, beforeItem, MF_BYCOMMAND); // 删除被改写的菜单
DrawMenuBar(); // 刷新菜单
注意:此hMenu必须使用第三点的方法得到,在MFC方式生成的对话框类中的 m_dlgCommandBar.GetMenu()得到的HMENU跟第三点里得到的结果是不一致的,我试过操纵m_dlgCommandBar.GetMenu()方式得到的HMENU,结果是菜单确实是更改了,但是显示没有效果而用第三点的方法得到的hMenu是有效果的。