Документы с вкладками MFC - как включить среднюю кнопку мыши для закрытия документа? - PullRequest
3 голосов
/ 05 августа 2009

Если вы создаете новое приложение MFC (с пакетом MFC Feature Pack) и используете все значения по умолчанию, нажмите «Готово». Он создает приложение MDI с новым стилем «Документы с вкладками».

alt text

Я думаю, что это здорово, за исключением того, что меня раздражает, что я не могу закрыть окно документа с вкладками, щелкнув средней кнопкой мыши на вкладке.

Это возможно в Firefox, IE, Chrome и, что более важно, VS2008 . Но нажатие средней кнопки на вкладке ничего не дает.

Я не могу понять, как переопределить панель вкладок, чтобы я мог обработать сообщение ON_WM_MBUTTONDOWN. Есть идеи?

Редактировать : Полагаю, мне нужно создать подкласс CMFCTabCtrl, возвращенный из CMDIFrameWndEx :: GetMDITabs ...

1 Ответ

2 голосов
/ 06 августа 2009

Подклассы не нужны (фу). Удалось заставить его работать, взломав 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);
}
...