// static helper void CToolbarHelper::PrepareMenuItems(CMenu* pMenu, CWnd* pWnd) { // update item states CCmdUI state; state.m_pMenu = pMenu; state.m_nIndexMax = pMenu->GetMenuItemCount(); for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax; state.m_nIndex++) { UINT nCmdID = pMenu->GetMenuItemID(state.m_nIndex); if (nCmdID == (UINT)-1) // submenu { CMenu* pSubMenu = pMenu->GetSubMenu(state.m_nIndex); if (pSubMenu) PrepareMenuItems(pSubMenu, pWnd); } else if (nCmdID != 0) { state.m_nID = nCmdID; pWnd->OnCmdMsg(state.m_nID, CN_UPDATE_COMMAND_UI, &state, NULL); } } }
BOOL CToolbarHelper::DisplayDropMenu(UINT nCmdID, BOOL bPressBtn) { // see if we have a menu for it THButton dm; if (m_mapTHButtons.Lookup(nCmdID, dm) && dm.nMenuID) { CMenu menu, *pSubMenu; if (menu.LoadMenu(dm.nMenuID)) { pSubMenu = menu.GetSubMenu(dm.nSubMenu); if (pSubMenu) { PrepareMenuItems(pSubMenu, GetCWnd()); pSubMenu->SetDefaultItem(dm.nDefCmdID); CRect rItem; int nIndex = m_pToolbar->CommandToIndex(nCmdID); m_pToolbar->GetItemRect(nIndex, rItem); m_pToolbar->ClientToScreen(rItem); if (bPressBtn) { m_pToolbar->GetToolBarCtrl().PressButton(nCmdID, TRUE); } pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, rItem.left, rItem.bottom, GetCWnd()); if (bPressBtn) { m_pToolbar->GetToolBarCtrl().PressButton(nCmdID, FALSE); } return TRUE; // we handled it } } } return FALSE; }