轉自: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#