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

标签 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);

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

最佳答案

根据一些实验,当 MFC mdi 界面基于 CMDIFrameWndEx 框架托管基于 CMDIChildWndEx 的可停靠 Pane 并启用选项卡式文档时, float 窗口不可用,因此两者都不可用平铺或层叠。

要启用平铺,只需删除行

EnableMDITabbedGroups(TRUE, mdiTabParams);

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

更新:为了保留选项卡式界面并拆分屏幕,以下替代方法可以很好地将具有多个选项卡的单个水平 View 拆分为两个 View ,当前选项卡位于新 View 中。

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

关于c++ - 如何在 MFC 功能包中获取功能区控件以处理 ID_WINDOW_TILE_VERT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35987099/

相关文章:

C++:具有自定义结构的文本字段以支持数学或任何其他形式

c++ - 从存储在 CTreeCtrl 的 LPARAM 中的结构中检索地址/指针 (IXMLDOMNode*) - 不工作

mfc - 风险分析应用程序的GUI设计准则

c++ - 如何在使用功能区的 MFC 应用程序中将 F10 用作快捷方式

c++ - 如何在 C++ 中创建具有子函数的对象?

c++ - 无法创建模板 vector 迭代器

C++ - 你能假设 type* = std::array<type>::iterator 吗?

c++ - 将 MFC 库移植到 linux 和 ASSERT

c++ - 将注册表访问转换为来自 MFC 功能包的数据库调用

c++ - Windows-10 上的 CMDIChildWnd 外观和感觉