如何在MFC功能部件包中进行功能区控制以处理ID_WINDOW_TILE_VERT

时间:2016-03-14 12:06:00

标签: c++ mfc mfc-feature-pack

我正在移植旧的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);

直接,基本上做同样的事情,但不起作用。

1 个答案:

答案 0 :(得分:0)

通过一些实验,当MFC mdi界面基于 CMDIFrameWndEx 框架托管基于 CMDIChildWndEx 的可停靠窗格并且启用了选项卡式文档时,浮动窗口不可用,因此正在平铺或层叠。

要启用平铺,只需删除行

即可
EnableMDITabbedGroups(TRUE, mdiTabParams);

来自您的CMainFrame :: OnCreate方法。缺点是你也失去了很好的选项卡式文档UI。 FWIW,我也尝试在启用选项卡式组后调用 EnableDocking(CBRS_FLOAT_MULTI),但它没有任何区别。还在讨论中here

更新:为了保留选项卡式界面并拆分屏幕,以下选项适用于将具有多个标签的单个水平视图拆分为两个视图,并在新视图中使用当前标签。

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