百度都找不到,只好自己翻看MFC的源码,看到单步调试,都不会进入到OnShowMDITabContextMenu,只好自己重写ON_WM_CONTEXTMENU()消息响应,必须要加这个,不然没有效果
void CMDIFrameWndEx::OnContextMenu(CWnd* pWnd, CPoint point)
{
if (m_wndClientArea.GetMDITabs().GetSafeHwnd() == NULL)
{
Default();
return;
}
if (CMFCPopupMenu::GetActiveMenu() != NULL)
{
return;
}
if ((GetAsyncKeyState(VK_LBUTTON) & 0x8000) != 0) // Left mouse button is pressed
{
return;
}
if (pWnd->GetSafeHwnd() == m_wndClientArea.GetSafeHwnd())
{
CWnd* pWndCur = WindowFromPoint(point);
if (IsMemberOfMDITabGroup(pWndCur))
{
CMFCTabCtrl* pWndTab = DYNAMIC_DOWNCAST(CMFCTabCtrl, pWndCur);
if (pWndTab != NULL)
{
CPoint ptTab = point;
pWndTab->ScreenToClient(&ptTab);
const int nTab = pWndTab->GetTabFromPoint(ptTab);
if (nTab >= 0)
{
pWndTab->SetActiveTab(nTab);
OnShowMDITabContextMenu(point, GetMDITabsContextMenuAllowedItems(), FALSE);
}
}
}
else if ((CMFCPopupMenu::GetActiveMenu() == NULL) && (pWndCur == pWnd))
{
if (SendMessage(AFX_WM_TOOLBARMENU, (WPARAM) GetSafeHwnd(), MAKELPARAM(point.x, point.y)))
{
m_dockManager.OnPaneContextMenu(point);
}
}
}
else if (pWnd->GetSafeHwnd() == m_wndClientArea.GetMDITabs().GetSafeHwnd())
{
CMFCTabCtrl& wndTab = (CMFCTabCtrl&)(*pWnd);
CRect rectTabs;
wndTab.GetTabsRect(rectTabs);
CPoint ptTab = point;
wndTab.ScreenToClient(&ptTab);
const int nTab = wndTab.GetTabFromPoint(ptTab);
if (nTab >= 0)
{
wndTab.SetActiveTab(nTab);
OnShowMDITabContextMenu(point, GetMDITabsContextMenuAllowedItems(), FALSE);
}
}
else
{
Default();
}
}
以下代码测试,可用,能正确在选项卡上显示右键菜单
void CMainFrame::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: 在此处添加消息处理程序代码
if (pWnd->GetSafeHwnd() == m_wndClientArea.GetSafeHwnd())
{
CWnd* pWndCur = WindowFromPoint(point);
if (IsMemberOfMDITabGroup(pWndCur))
{
CMFCTabCtrl* pWndTab = DYNAMIC_DOWNCAST(CMFCTabCtrl, pWndCur);
if (pWndTab != NULL)
{
CPoint ptTab = point;
pWndTab->ScreenToClient(&ptTab);
const int nTab = pWndTab->GetTabFromPoint(ptTab);
if (nTab >= 0)
{
pWndTab->SetActiveTab(nTab);
CMenu menu;
CMenu* pSubMenu = NULL;
menu.LoadMenu(IDR_POPUP_DOC);
pSubMenu = menu.GetSubMenu(0);
CPoint pt = point;
ClientToScreen(&pt);
if (pSubMenu)
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, pWndCur);
}
}
}
}
__super::OnContextMenu(pWnd, point);
}
至于怎么关闭当前选中的文档,还没有找到方法,等找到再来发