MFC : 给主菜单动态添加删除一级子菜单

添加删除一级子菜单

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);
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值