MFC选项卡式文档 - 如何启用鼠标中键来关闭文档?

时间:2009-08-05 16:05:23

标签: mfc mfc-feature-pack tabbed-document-interface

如果创建新的MFC应用程序(使用MFC Feature Pack)并使用所有默认值,请单击“完成”。它使用新的“选项卡式文档”样式创建MDI应用程序。

alt text

我认为这些都很棒,除非我真的很烦我不能通过中间点击标签来关闭标签文档窗口。

这可以在Firefox,IE,Chrome中使用,更重要的是 VS2008 。但是单击选项卡上的中间按钮不会执行任何操作。

我无法弄清楚如何覆盖标签栏以允许我处理ON_WM_MBUTTONDOWN消息。有什么想法吗?

编辑:猜测我需要继承从CMDIFrameWndEx :: GetMDITabs返回的CMFCTabCtrl ......

1 个答案:

答案 0 :(得分:2)

不需要子类化(phew)。管理通过劫持大型机的PreTranslateMessage来使其工作。如果当前消息是鼠标中键消息,我会检查点击的位置。如果它在选项卡上,则关闭该选项卡。

BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
    switch (pMsg->message)
    {
        case WM_MBUTTONDBLCLK:
        case WM_MBUTTONDOWN:
        {
            //clicked middle button somewhere in the mainframe.
            //was it on a tab group of the MDI tab area?
            CWnd* pWnd = FromHandle(pMsg->hwnd);
            CMFCTabCtrl* tabGroup = dynamic_cast<CMFCTabCtrl*>(pWnd);
            if (tabGroup)
            {
                //clicked middle button on a tab group.
                //was it on a tab?
                CPoint clickLocation = pMsg->pt;
                tabGroup->ScreenToClient(&clickLocation);
                int tabIndex = tabGroup->GetTabFromPoint(clickLocation);
                if (tabIndex != -1)
                {
                    //clicked middle button on a tab.
                    //send a WM_CLOSE message to it
                    CWnd* pTab = tabGroup->GetTabWnd(tabIndex);
                    if (pTab)
                    {
                        pTab->SendMessage(WM_CLOSE, 0, 0);
                    }
                }
            }
            break;
        }
        default:
        {
            break;
        }
    }
    return CMDIFrameWndEx::PreTranslateMessage(pMsg);
}