Как получить управление лентой в пакете функций MFC для обработки ID_WINDOW_TILE_VERT

Я портирую более старое приложение MFC для использования пакета функций MFC с пользовательским интерфейсом ленты и обнаружил, что пользовательский интерфейс ленты не обрабатывает команды мозаики окон 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);

напрямую, что, по сути, делает то же самое и не работает.


person SmacL    schedule 14.03.2016    source источник


Ответы (1)


Из некоторых экспериментов, когда интерфейс MFC mdi основан на фреймах CMDIFrameWndEx, на которых размещены закрепляемые панели на основе CMDIChildWndEx и включены документы с вкладками, плавающие окна недоступны и, следовательно, ни мозаичные, ни каскадный.

Чтобы включить мозаику, просто удалите строку

EnableMDITabbedGroups(TRUE, mdiTabParams);

из вашего метода CMainFrame :: OnCreate. Обратной стороной является потеря красивого пользовательского интерфейса документа с вкладками. FWIW, я также пробовал вызвать EnableDocking (CBRS_FLOAT_MULTI) после включения групп с вкладками, но это не имеет никакого значения. Также обсуждается здесь

Обновление. Чтобы сохранить интерфейс с вкладками и разделить экраны, можно использовать следующую альтернативу для разделения одного горизонтального представления с несколькими вкладками на два представления, при этом текущая вкладка находится в новом представлении.

void SplitViews(CMDIFrameWndEx *pFrame) 
{   
    pFrame->MDITabNewGroup();
    pFrame->MDITabMoveToNextGroup(); 
}
person SmacL    schedule 17.03.2016