4

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

替代文字

我认为这些都很棒,只是我无法通过在选项卡上单击鼠标中键来关闭选项卡式文档窗口,这让我很恼火。

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

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

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

4

1 回答 1

2

不需要子类化(呼)。通过劫持大型机的 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);
}
于 2009-08-06T13:20:23.600 回答