添加删除一级子菜单
private:
BOOL AddDyMenu(DWORD dwMenuRcId, TCHAR* pMenuName);
BOOL DelDyMenu(TCHAR* pMenuName);
BOOL CMainView::AddDyMenu(DWORD dwMenuRcId, TCHAR* pMenuName) {
/// 动态添加菜单
BOOL bRc = FALSE;
CMenu NewMenu;
CMenu* pMainMenu = NULL;
CMenu* pSubMenu = NULL;
pMainMenu = AfxGetMainWnd()->GetMenu(); ///< 只有主窗口有可以正常操作的菜单
if (NULL != pMainMenu) {
if (NewMenu.LoadMenu(dwMenuRcId)) {
if (pMainMenu->AppendMenu(
MF_POPUP | MF_STRING,
(UINT)NewMenu.GetSafeHmenu(),
(NULL != pMenuName) ? pMenuName : TEXT(""))) {
AfxGetMainWnd()->DrawMenuBar();
bRc = TRUE;
}
/// ! 将菜单句柄和对象分离
NewMenu.Detach(); ///< 防止NewMenu局部对象析构时, 将菜单句柄销毁
}
}
return bRc;
}
BOOL CMainView::DelDyMenu(TCHAR* pMenuName) {
BOOL bRc = FALSE;
UINT n = 0;
UINT uMenuItemCnt = 0;
CMenu* pMainMenu = NULL;
CMenu* pSubMenu = NULL;
CString str;
pMainMenu = AfxGetMainWnd()->GetMenu();
if (NULL != pMainMenu) {
uMenuItemCnt = pMainMenu->GetMenuItemCount();
for (n = 0; n < uMenuItemCnt; n++) {
pSubMenu = pMainMenu->GetSubMenu(n);
if (pMainMenu->GetMenuString(n, str, MF_BYPOSITION) > 0) {
/// 3目运算符必须用圆括号围起来, 否则 == 判断失误
if (str == ((NULL != pMenuName) ? pMenuName : TEXT(""))) {
bRc = TRUE;
pMainMenu->DeleteMenu(n, MF_BYPOSITION);
}
}
}
}
if (bRc ) {
AfxGetMainWnd()->DrawMenuBar();
}
return bRc;
}
void CMainView::OnDyCreateMenu()
{
AddDyMenu(IDR_MENU_TEST, TEXT("运行时创建的菜单"));
}
void CMainView::OnDyDestoryMenu()
{
DelDyMenu(TEXT("运行时创建的菜单"));
}
动态修改菜单项位图和文字
BOOL CMainView::ModifyDyMenu(
TCHAR* pMenuName,
DWORD dwMenuRcId,
TCHAR* pMenuItemString,
CBitmap* pbmCheck,
CBitmap* pbmUnCheck) {
BOOL bRc = FALSE;
UINT n = 0;
UINT uMenuItemCnt = 0;
DWORD dwMenuItemId = 0;
CMenu* pMainMenu = NULL;
CMenu* pSubMenu = NULL;
CString str;
pMainMenu = AfxGetMainWnd()->GetMenu();
if (NULL != pMainMenu) {
uMenuItemCnt = pMainMenu->GetMenuItemCount();
for (n = 0; n < uMenuItemCnt; n++) {
if (pMainMenu->GetMenuString(n, str, MF_BYPOSITION) > 0) {
/// 3目运算符必须用圆括号围起来, 否则 == 判断失误
if (str == ((NULL != pMenuName) ? pMenuName : TEXT(""))) {
bRc = TRUE;
pSubMenu = pMainMenu->GetSubMenu(n);
break;
}
}
}
}
if (NULL != pSubMenu) {
/// 修改菜单项位图
bRc = pSubMenu->SetMenuItemBitmaps(IDM_PIC, MF_BYCOMMAND, pbmUnCheck, pbmCheck);
/// 修改菜单项文字
bRc = pSubMenu->ModifyMenu(
IDM_PIC,
MF_BYCOMMAND,
IDM_PIC, ///< ! 否则菜单项ID被改掉了...
(NULL != pMenuItemString) ? pMenuItemString : TEXT(""));
/** @note 遍历菜单项ID
uMenuItemCnt = pSubMenu->GetMenuItemCount();
for (n = 0; n < uMenuItemCnt; n++) {
dwMenuItemId = pSubMenu->GetMenuItemID(n);
}
*/
}
return bRc;
}
void CMainView::OnDyCreateMenu()
{
AddDyMenu(IDR_MENU_TEST, TEXT("运行时创建的菜单"));
ModifyDyMenu(
TEXT("运行时创建的菜单"),
IDM_PIC,
TEXT("位图菜单项1"),
&m_bmWasChecked,
&m_bmWasNotChecked);
/// 后2个参数给NULL, 等于没有修改
// ModifyDyMenu(TEXT("运行时创建的菜单"), IDM_PIC, NULL, NULL);
}
CMainView::CMainView()
{
// TODO: add construction code here
m_iMenuItemId = -1;
m_bmWasChecked.LoadBitmap(IDB_BITMAP_ENA);
m_bmWasNotChecked.LoadBitmap(IDB_BITMAP_DIS);
}