如果创建新的MFC应用程序(使用MFC Feature Pack)并使用所有默认值,请单击“完成”。它使用新的“选项卡式文档”样式创建MDI应用程序。
我认为这些都很棒,除非我真的很烦我不能通过中间点击标签来关闭标签文档窗口。
这可以在Firefox,IE,Chrome中使用,更重要的是 VS2008 。但是单击选项卡上的中间按钮不会执行任何操作。
我无法弄清楚如何覆盖标签栏以允许我处理ON_WM_MBUTTONDOWN
消息。有什么想法吗?
编辑:猜测我需要继承从CMDIFrameWndEx :: GetMDITabs返回的CMFCTabCtrl ......
答案 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);
}