2009-08-05 74 views
3

如果您創建一個新的MFC應用程序(使用MFC功能包)並使用所有默認值,請單擊完成。它使用新的「選項卡式文檔」樣式創建一個MDI應用程序。MFC選項卡式文檔 - 如何啓用鼠標中鍵來關閉文檔?

alt text 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); 
} 
相關問題