如何在 MFC 功能包中获取功能区控件以处理ID_WINDOW_TILE_VERT

How to get ribbon control in MFC feature pack to process ID_WINDOW_TILE_VERT

本文关键字:ID 处理 WINDOW VERT TILE 控件 功能区 MFC 功能 获取 包中      更新时间:2023-10-16

我正在移植较旧的 MFC 应用程序以使用带有功能区 UI 的 MFC 功能包,并发现功能区 UI 不处理 MDI 窗口平铺命令,例如ID_WINDOW_TILE_VERT。 有没有办法启用此功能?

单步执行 MFC 源,我在 C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\src\mfc\winmdi.cpp 中得到了以下内容,这似乎是正确的;

BOOL CMDIFrameWnd::OnMDIWindowCmd(UINT nID)
{
    ASSERT(m_hWndMDIClient != NULL);
    UINT msg;
    UINT wParam = 0;
    switch (nID)
    {
    default:
        return FALSE;       // not for us
    case ID_WINDOW_ARRANGE:
        msg = WM_MDIICONARRANGE;
        break;
    case ID_WINDOW_CASCADE:
        msg = WM_MDICASCADE;
        break;
    case ID_WINDOW_TILE_HORZ:
        wParam = MDITILE_HORIZONTAL;
        // fall through
    case ID_WINDOW_TILE_VERT:
        ASSERT(MDITILE_VERTICAL == 0);
        msg = WM_MDITILE;
        break;
    }
    ::SendMessage(m_hWndMDIClient, msg, wParam, 0);
    return TRUE;
}

我也试过打电话

MDITile(MDITILE_HORIZONTAL);

直接,它本质上做同样的事情并且不起作用。

根据一些实验,当 MFC mdi 接口基于 CMDIFrameWndEx 框架托管基于 CMDIChildWndEx 的可停靠窗格并启用选项卡式文档时,浮动窗口不可用,因此平铺或级联也不可用。

要启用平铺,只需删除该行即可

EnableMDITabbedGroups(TRUE, mdiTabParams);

从您的 CMainFrame::OnCreate 方法。 缺点是你也会丢失漂亮的选项卡式文档UI。 FWIW,在启用选项卡式组后,我也尝试调用 EnableDocking(CBRS_FLOAT_MULTI),但这没有任何区别。 这里也在讨论中

更新:为了保留选项卡式界面并拆分屏幕,以下替代方法非常适合将具有多个选项卡的单个水平视图拆分为两个视图,当前选项卡位于新视图中。

void SplitViews(CMDIFrameWndEx *pFrame) 
{   
    pFrame->MDITabNewGroup();
    pFrame->MDITabMoveToNextGroup(); 
}