兔子的技术博客

兔子

   :: 首页 :: 联系 :: 聚合  :: 管理
  202 Posts :: 0 Stories :: 43 Comments :: 0 Trackbacks

留言簿(10)

最新评论

阅读排行榜

评论排行榜

转自: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(
23);   
        ::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#

posted on 2009-12-25 11:36 会飞的兔子 阅读(849) 评论(0)  编辑 收藏 引用 所属分类: C++库,组件

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理