BOOL CMDIFrameWnd::PreTranslateMessage(MSG* pMsg) { // check for special cancel modes for ComboBoxes if (pMsg->message == WM_LBUTTONDOWN || pMsg->message == WM_NCLBUTTONDOWN) AfxCancelModes(pMsg->hwnd); // filter clicks // allow tooltip messages to be filtered if (CWnd::PreTranslateMessage(pMsg)) return TRUE; #ifndef _AFX_NO_OLE_SUPPORT // allow hook to consume message if (m_pNotifyHook != NULL && m_pNotifyHook->OnPreTranslateMessage(pMsg)) return TRUE; #endif CMDIChildWnd* pActiveChild = MDIGetActive(); // current active child gets first crack at it if (pActiveChild != NULL && pActiveChild->PreTranslateMessage(pMsg)) return TRUE; if (pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST) { // translate accelerators for frame and any children if (m_hAccelTable != NULL && ::TranslateAccelerator(m_hWnd, m_hAccelTable, pMsg)) { return TRUE; } // special processing for MDI accelerators last // and only if it is not in SDI mode (print preview) if (GetActiveView() == NULL) { if (pMsg->message == WM_KEYDOWN || pMsg->message == WM_SYSKEYDOWN) { // the MDICLIENT window may translate it if (::TranslateMDISysAccel(m_hWndMDIClient, pMsg)) return TRUE; } } } return FALSE; }
BOOL CMDIChildWnd::PreTranslateMessage(MSG* pMsg) { // check for special cancel modes for combo boxes if (pMsg->message == WM_LBUTTONDOWN || pMsg->message == WM_NCLBUTTONDOWN) AfxCancelModes(pMsg->hwnd); // filter clicks // allow tooltip messages to be filtered if (CWnd::PreTranslateMessage(pMsg)) return TRUE; // we can't call 'CFrameWnd::PreTranslate' since it will translate // accelerators in the context of the MDI Child - but since MDI Child // windows don't have menus this doesn't work properly. MDI Child // accelerators must be translated in context of their MDI Frame. if (pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST) { // use document specific accelerator table over m_hAccelTable HACCEL hAccel = GetDefaultAccelerator(); return hAccel != NULL && ::TranslateAccelerator(GetMDIFrame()->m_hWnd, hAccel, pMsg); } return FALSE; }
void CFileManagerDlg::OnInitMenuPopup(CMenu* pMenu, UINT nIndex, BOOL bSysMenu) { // CDialogEx::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu); AfxCancelModes(m_hWnd); if (bSysMenu) return; // don't support system menu ENSURE_VALID(pMenu); // check the enabled state of various menu items CCmdUI state; state.m_pMenu = pMenu; ASSERT(state.m_pOther == NULL); ASSERT(state.m_pParentMenu == NULL); // determine if menu is popup in top-level menu and set m_pOther to // it if so (m_pParentMenu == NULL indicates that it is secondary popup) HMENU hParentMenu; if (AfxGetThreadState()->m_hTrackingMenu == pMenu->m_hMenu) state.m_pParentMenu = pMenu; // parent == child for tracking popup else if ((hParentMenu = ::GetMenu(m_hWnd)) != NULL) { CWnd* pParent = GetTopLevelParent(); // child windows don't have menus -- need to go to the top! if (pParent != NULL && (hParentMenu = pParent->GetMenu()->GetSafeHmenu()) != NULL) { int nIndexMax = ::GetMenuItemCount(hParentMenu); for (int nItemIndex = 0; nItemIndex < nIndexMax; nItemIndex++) { if (::GetSubMenu(hParentMenu, nItemIndex) == pMenu->m_hMenu) { // when popup is found, m_pParentMenu is containing menu state.m_pParentMenu = CMenu::FromHandle(hParentMenu); break; } } } } state.m_nIndexMax = pMenu->GetMenuItemCount(); for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax; state.m_nIndex++) { state.m_nID = pMenu->GetMenuItemID(state.m_nIndex); if (state.m_nID == 0) continue; // menu separator or invalid cmd - ignore it ASSERT(state.m_pOther == NULL); ASSERT(state.m_pMenu != NULL); if (state.m_nID == (UINT)-1) { // possibly a popup menu, route to first item of that popup state.m_pSubMenu = pMenu->GetSubMenu(state.m_nIndex); if (state.m_pSubMenu == NULL || (state.m_nID = state.m_pSubMenu->GetMenuItemID(0)) == 0 || state.m_nID == (UINT)-1) { continue; // first item of popup can't be routed to } state.DoUpdate(this, FALSE); // 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. state.m_pSubMenu = NULL; state.DoUpdate(this, state.m_nID < 0xF000); } // adjust for menu deletions and additions UINT nCount = pMenu->GetMenuItemCount(); if (nCount < state.m_nIndexMax) { state.m_nIndex -= (state.m_nIndexMax - nCount); while (state.m_nIndex < nCount && pMenu->GetMenuItemID(state.m_nIndex) == state.m_nID) { state.m_nIndex++; } } state.m_nIndexMax = nCount; } }