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

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

http://i25.tinypic.com/s48img.png

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

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

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

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

1 ответ

Решение

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