/** * Show context menu and handle user selection. */ void CLocationView::OnContextMenu(CWnd* pWnd, CPoint point) { if (point.x == -1 && point.y == -1) { //keystroke invocation CRect rect; GetClientRect(rect); ClientToScreen(rect); point = rect.TopLeft(); point.Offset(5, 5); } CRect rc; CPoint pt = point; GetClientRect(rc); ScreenToClient(&pt); BCMenu menu; VERIFY(menu.LoadMenu(IDR_POPUP_LOCATIONBAR)); theApp.TranslateMenu(menu.m_hMenu); BCMenu* pPopup = (BCMenu *) menu.GetSubMenu(0); ASSERT(pPopup != NULL); CCmdUI cmdUI; cmdUI.m_pMenu = pPopup; cmdUI.m_nIndexMax = cmdUI.m_pMenu->GetMenuItemCount(); for (cmdUI.m_nIndex = 0 ; cmdUI.m_nIndex < cmdUI.m_nIndexMax ; ++cmdUI.m_nIndex) { cmdUI.m_nID = cmdUI.m_pMenu->GetMenuItemID(cmdUI.m_nIndex); switch (cmdUI.m_nID) { case ID_DISPLAY_MOVED_NONE: cmdUI.SetRadio(m_displayMovedBlocks == DISPLAY_MOVED_NONE); break; case ID_DISPLAY_MOVED_ALL: cmdUI.SetRadio(m_displayMovedBlocks == DISPLAY_MOVED_ALL); break; case ID_DISPLAY_MOVED_FOLLOW_DIFF: cmdUI.SetRadio(m_displayMovedBlocks == DISPLAY_MOVED_FOLLOW_DIFF); break; } } CString strItem; CString strNum; int nLine = -1; int bar = IsInsideBar(rc, pt); // If cursor over bar, format string with linenumber, else disable item if (bar != BAR_NONE) { // If outside bar area use left bar if (bar == BAR_YAREA) bar = BAR_LEFT; nLine = GetLineFromYPos(pt.y, bar); strNum.Format(_T("%d"), nLine + 1); // Show linenumber not lineindex } else pPopup->EnableMenuItem(ID_LOCBAR_GOTODIFF, MF_GRAYED); LangFormatString1(strItem, ID_LOCBAR_GOTOLINE_FMT, strNum); pPopup->SetMenuText(ID_LOCBAR_GOTODIFF, strItem, MF_BYCOMMAND); // invoke context menu // we don't want to use the main application handlers, so we use flags TPM_NONOTIFY | TPM_RETURNCMD // and handle the command after TrackPopupMenu int command = pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_NONOTIFY | TPM_RETURNCMD, point.x, point.y, AfxGetMainWnd()); CMergeDoc* pDoc = GetDocument(); switch (command) { case ID_LOCBAR_GOTODIFF: m_view[MERGE_VIEW_LEFT]->GotoLine(nLine, true, bar); if (bar == BAR_LEFT || bar == BAR_RIGHT) m_view[bar]->SetFocus(); break; case ID_EDIT_WMGOTO: m_view[MERGE_VIEW_LEFT]->WMGoto(); break; case ID_DISPLAY_MOVED_NONE: SetConnectMovedBlocks(DISPLAY_MOVED_NONE); pDoc->SetDetectMovedBlocks(FALSE); break; case ID_DISPLAY_MOVED_ALL: SetConnectMovedBlocks(DISPLAY_MOVED_ALL); pDoc->SetDetectMovedBlocks(TRUE); break; case ID_DISPLAY_MOVED_FOLLOW_DIFF: SetConnectMovedBlocks(DISPLAY_MOVED_FOLLOW_DIFF); pDoc->SetDetectMovedBlocks(TRUE); break; } }
void FileScrapDropDlg::OnInitMenuPopup(CMenu* pPopupMenu, xpr_uint_t nIndex, xpr_bool_t bSysMenu) { ASSERT(pPopupMenu != XPR_NULL); //super::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu); // for multi-language BCMenu *pBCPopupMenu = dynamic_cast<BCMenu *>(pPopupMenu); if (pBCPopupMenu != XPR_NULL) { xpr_uint_t sId; xpr_sint_t sCount = pBCPopupMenu->GetMenuItemCount(); const xpr_tchar_t *sStringId; const xpr_tchar_t *sString; xpr::string sMenuText; CommandStringTable &sCommandStringTable = CommandStringTable::instance(); xpr_sint_t i; for (i = 0; i < sCount; ++i) { sId = pBCPopupMenu->GetMenuItemID(i); // apply string table if (sId != 0) // if sId is 0, it's separator. { if (sId == -1) { // if sId(xpr_uint_t) is -1, it's sub-menu. pBCPopupMenu->GetMenuText(i, sMenuText, MF_BYPOSITION); sString = gApp.loadString(sMenuText); pBCPopupMenu->SetMenuText(i, (xpr_tchar_t *)sString, MF_BYPOSITION); } else { sStringId = sCommandStringTable.loadString(sId); if (sStringId != XPR_NULL) { sString = gApp.loadString(sStringId); pBCPopupMenu->SetMenuText(sId, (xpr_tchar_t *)sString, MF_BYCOMMAND); } } } } } // Check the enabled state of various menu items. CCmdUI sState; sState.m_pMenu = pPopupMenu; ASSERT(sState.m_pOther == XPR_NULL); ASSERT(sState.m_pParentMenu == XPR_NULL); // Determine if menu is popup in top-level menu and set m_pOther to // it if so (m_pParentMenu == XPR_NULL indicates that it is secondary popup). HMENU sParentMenu; if (AfxGetThreadState()->m_hTrackingMenu == pPopupMenu->m_hMenu) sState.m_pParentMenu = pPopupMenu; // Parent == child for tracking popup. else if ((sParentMenu = ::GetMenu(m_hWnd)) != XPR_NULL) { CWnd *sParentWnd = this; // Child windows don't have menus--need to go to the top! if (sParentWnd != XPR_NULL && (sParentMenu = ::GetMenu(sParentWnd->m_hWnd)) != XPR_NULL) { xpr_sint_t sIndex; xpr_sint_t sIndexMax = ::GetMenuItemCount(sParentMenu); for (sIndex = 0; sIndex < sIndexMax; ++sIndex) { if (::GetSubMenu(sParentMenu, sIndex) == pPopupMenu->m_hMenu) { // When popup is found, m_pParentMenu is containing menu. sState.m_pParentMenu = CMenu::FromHandle(sParentMenu); break; } } } } sState.m_nIndexMax = pPopupMenu->GetMenuItemCount(); for (sState.m_nIndex = 0; sState.m_nIndex < sState.m_nIndexMax; ++sState.m_nIndex) { sState.m_nID = pPopupMenu->GetMenuItemID(sState.m_nIndex); if (sState.m_nID == 0) continue; // Menu separator or invalid cmd - ignore it. ASSERT(sState.m_pOther == XPR_NULL); ASSERT(sState.m_pMenu != XPR_NULL); if (sState.m_nID == (xpr_uint_t)-1) { // Possibly a popup menu, route to first item of that popup. sState.m_pSubMenu = pPopupMenu->GetSubMenu(sState.m_nIndex); if (sState.m_pSubMenu == XPR_NULL || (sState.m_nID = sState.m_pSubMenu->GetMenuItemID(0)) == 0 || sState.m_nID == (xpr_uint_t)-1) { continue; // First item of popup can't be routed to. } sState.DoUpdate(this, XPR_TRUE); // Popups are never auto disabled. } else { // Normal menu item. // Auto enable/disable if frame window has m_bAutoMenuEnable // set and command is _not_ a system command. sState.m_pSubMenu = XPR_NULL; sState.DoUpdate(this, XPR_FALSE); } // Adjust for menu deletions and additions. xpr_uint_t sCount = pPopupMenu->GetMenuItemCount(); if (sCount < sState.m_nIndexMax) { sState.m_nIndex -= (sState.m_nIndexMax - sCount); while (sState.m_nIndex < sCount && pPopupMenu->GetMenuItemID(sState.m_nIndex) == sState.m_nID) { sState.m_nIndex++; } } sState.m_nIndexMax = sCount; } }