转自:http://blog.csdn.net/abesky/archive/2009/08/14/4446863.aspx#
首先怎样弹出界面库的菜单呢?
首先模块向主窗口发出弹出菜单请求,然后在主程序中收到请求后向发出请求模块询问菜单,模块加载菜单返回然后由主窗口调用函数弹出菜单。
 
//定义查询菜单的消息   
const UINT WM_GETCONTEXTMENU = ::RegisterWindowMessage(_T("GetContextMenu"));   
//模块需要弹出菜单时向主窗口发送请求   
::SendMessage(hMainWnd, WM_CONTEXTMENU, (WPARAM)m_hWnd,    
            MAKELPARAM(point.x, point.y));   
//主窗口响应处理   
BEGIN_MESSAGE_MAP(CMainFrame, CMDIChildWndEx)   
    

 ..
..   
    ON_WM_CONTEXTMENU()   
END_MESSAGE_MAP()   
void CMainFrame::OnContextMenu(CWnd* pWnd, CPoint point)   
{   
    HMENU hMenu(0);   
    if (pWnd)   
    {   
        hMenu = (HMENU)pWnd->SendMessage(WM_GETCONTEXTMENU);   
    }   
    if (hMenu)   
    {   
        theApp.GetContextMenuManager()->ShowPopupMenu(   
            hMenu, point.x, point.y, pWnd, TRUE);//注意此处参数,否则模块无法处理命令   
    }   
    //以下可根据情况注释掉   
    else  
    {   
        CMFCPopupMenu* pMenuActive = CMFCPopupMenu::GetActiveMenu();   
        if (pMenuActive != NULL)   
        {   
            pMenuActive->SendMessage(WM_CLOSE);   
        }   
    }   
}   
//模块收到主窗口菜单询问加载菜单   
BEGIN_MESSAGE_MAP(CXXXXDlg, CDialog)   
    


 
   
    ON_REGISTERED_MESSAGE(WM_GETCONTEXTMENU, &CXXXXDlg::OnGetContextMenu)   
END_MESSAGE_MAP()   
  
LRESULT CXXXXDlg::OnGetContextMenu(WPARAM wParam, LPARAM lParam)   
{   
    HMENU hMenu = ::LoadMenu( ..);
..);   
    return (LRESULT)hMenu;   
}  
BCGControlBar以及VC2008FeaturePack在菜单中添加图标一般来说需要在资源里添加一个专门的Toolbar工具条资源 然后调用AddToolBarForImageCollection这个方法来加载图标,此种方法适合资源都在主工程时使用。
如果是其他模块请求主程序弹出菜单时这时候怎么增加菜单图标?
我们可以利用在菜单中增加自定义的数据来保存图标,当然也可以直接设置菜单图标,这里我只以在菜单使用自定义数据为例子。
 
//在发送弹出菜单请求时设置好菜单的图标   
            int nCount = GetMenuItemCount(m_hContext);   
            MENUITEMINFO menuInfo;   
            menuInfo.cbSize = sizeof MENUITEMINFO;   
            menuInfo.wID = 0;   
            menuInfo.fMask = MIIM_ID | MIIM_DATA;   
            for (int i(0); i < nCount; i++)   
            {              
                ::GetMenuItemInfo(m_hContext, i, TRUE, &menuInfo);   
                menuInfo.dwItemData = (ULONG_PTR)m_mMeunIcon[menuInfo.wID];   
                SetMenuItemInfo(m_hContext, i, TRUE, &menuInfo);   
            }  
ok图标已经设置好了,然后需要在CMainframe中增加一个虚函数的实现即可
函数原型是
 
virtual BOOL OnDrawMenuImage (  CDC* pDC,    
                                                                 const CMFCToolBarMenuButton* pMenuButton,    
                                                                 const CRect& rectImage);  
实现:
 
BOOL CMainFrame::OnDrawMenuImage (  CDC* pDC,    
                                  const CMFCToolBarMenuButton* pMenuButton,    
                                  const CRect& rectImage)   
{   
    ASSERT_VALID (pDC);   
    ASSERT_VALID (pMenuButton);   
    if (pMenuButton->m_dwdItemData)   
    {   
        CRect rc = rectImage;   
        rc.DeflateRect(2, 3);   
        ::DrawIconEx(pDC->m_hDC, rc.left, rc.top, (HICON)pMenuButton->m_dwdItemData,    
            rc.Width(), rc.Height(), 0, NULL, DI_NORMAL);   
        return TRUE;   
    }   
    return FALSE;   
}  以上代码为VC2008FeaturePack环境,在bcg环境下类似只需要替换相应的函数即可
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/abesky/archive/2009/08/14/4446863.aspx#