2009-08-05 15 views
3

(MFC Feature Packを使用して)新しい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); 
} 
関連する問題