4

(MFC Feature Packを使用して)新しいMFCアプリケーションを作成し、すべての既定値を使用する場合は、[完了]をクリックします。新しい「タブ付きドキュメント」スタイルのMDIアプリケーションを作成します。

代替テキスト

タブを中クリックしてタブ付きドキュメントウィンドウを閉じることができないのが本当に面倒なことを除けば、これらは素晴らしいと思います。

これは、Firefox、IE、Chrome、さらに重要なのはVS2008で可能です。ただし、タブの中央のボタンをクリックしても何も起こりません。

タブバーをオーバーライドしてON_WM_MBUTTONDOWNメッセージを処理できるようにする方法がわかりません。何か案は?

編集:CMDIFrameWndEx::GetMDITabsから返されたCMFCTabCtrlをサブクラス化する必要があると推測しています...

4

1 に答える 1

2

サブクラス化は必要ありません(おい)。メインフレームの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);
}
于 2009-08-06T13:20:23.600 に答える