Re: Независимые по высоте Splitter-окна
От: den123 Израиль http://den123.smugmug.com
Дата: 21.07.04 04:39
Оценка: 3 (1)
Здравствуйте, George_B, Вы писали:

G_B>Здравствуйте коллеги!


G_B>Подскажите пожалуйста существует ли возможность средствами

G_B>MFC разместить в окне несколько Splitter-окон, в шахматном порядке,
G_B>но так чтобы высота каждого менялась независимо
G_B>от соседних боковых окон( как в OutLook ).
G_B>С вложением окон, описанным в MSDN так не получается.

G_B>Заранее благодарен.


Вот кусок программы. Создает 4 View


BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/,
    CCreateContext* pContext)
{
    if (!m_wndSplitter.CreateStatic(this, 1, 2))
    {
        TRACE0("Failed to CreateStaticSplitter\n");
        return FALSE;
    }
    
    // Add the left splitter pane - wich is a nested splitter with 2 rows
    if (!m_leftSplitter.CreateStatic(
        &m_wndSplitter,                        // our parent window is the main splitter
        2, 1,                                // the new splitter is 2 rows, 1 column
        WS_CHILD | WS_VISIBLE | WS_BORDER,  // style, WS_BORDER is needed
        m_wndSplitter.IdFromRowCol(0, 0)    // new splitter is in the first row, 2nd column of main splitter
        ))
    {
        TRACE0("Failed to create left splitter\n");
        return FALSE;
    }

    // add the right splitter pane - which is a nested splitter with 2 rows
    if (!m_rightSplitter.CreateStatic(
        &m_wndSplitter,                        // our parent window is the main splitter
        2, 1,                                // the new splitter is 2 rows, 1 column
        WS_CHILD | WS_VISIBLE | WS_BORDER,  // style, WS_BORDER is needed
        m_wndSplitter.IdFromRowCol(0, 1)    // new splitter is in the first row, 2nd column of main splitter
       ))
    {
        TRACE0("Failed to create nested splitter\n");
        return FALSE;
    }

    // Create views - panes
    if (!m_leftSplitter.CreateView(0, 0,
        RUNTIME_CLASS(CChannelView), CSize(100, 100), pContext))
    {
        TRACE0("Failed to create CChannelView pane\n");
        return FALSE;
    }
    if (!m_leftSplitter.CreateView(1, 0,
        RUNTIME_CLASS(CMemoView), CSize(100, 100), pContext))
    {
        TRACE0("Failed to create CMemoView pane\n");
        return FALSE;
    }

    if (!m_rightSplitter.CreateView(0, 0,
        RUNTIME_CLASS(CItemsView), CSize(100, 100), pContext))
    {
        TRACE0("Failed to create CItemList pane\n");
        return FALSE;
    }
    if (!m_rightSplitter.CreateView(1, 0,
        RUNTIME_CLASS(CItemView), CSize(100, 100), pContext))
    {
        TRACE0("Failed to create CItemView pane\n");
        return FALSE;
    }

    // Initialize positions
    NODES positions = CConfig::GetInstance()->m_configDoc->GetNodesByTagName((DOMNode*)0, CConfig::ELEMENT_POSITION);
    for(NODES::size_type i = 0; i < positions.size(); ++i)
    {
        DOMNode* position = positions[i];
        string name = CConfig::GetInstance()->m_configDoc->GetAttr(position, CConfig::ATTR_NAME);
        int x = CConfig::GetInstance()->m_configDoc->GetAttrInt(position, CConfig::ATTR_X);
        int xMin = CConfig::GetInstance()->m_configDoc->GetAttrInt(position, CConfig::ATTR_X_MIN);
        int y = CConfig::GetInstance()->m_configDoc->GetAttrInt(position, CConfig::ATTR_Y);
        int yMin = CConfig::GetInstance()->m_configDoc->GetAttrInt(position, CConfig::ATTR_Y_MIN);
        if (name == CConfig::VAL_NAME_MAIN_SPLITTER)
        {
            // Main splitter
            m_wndSplitter.SetColumnInfo(0, x, xMin);
        }
        else if (name == CConfig::VAL_NAME_LEFT_SPLITTER)
        {
            // Left splitter
            m_leftSplitter.SetRowInfo(0, y, yMin);
        }
        else if (name == CConfig::VAL_NAME_RIGHT_SPLITTER)
        {
            // Right splitter
            m_rightSplitter.SetRowInfo(0, y, yMin);
        }
    }

    // it all worked, we now have two splitter windows which contain
    //  three different views

    return TRUE;
}

Для начального расположения я использую данные из своего класса CConfig. Вы можете изменить на все, что угодно свое, в т.ч. и просто константы.
WBR — Yuriy
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.