Документы с вкладками 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);
}