CSplitterWnd переключение между горизонтальным и вертикальным сплиттером? - PullRequest
0 голосов
/ 25 декабря 2010

Предположим, у меня есть разветвитель с 2 рядами.

--------
||
--------
||
--------

Как мне сделать это

---------
|||
|||
|||
---------

перейти от горизонтального разделения к вертикальному разделению

без необходимости повторного создания всего разделителя?

Код:

if (!m_wndSplitter.CreateStatic(this, 1, 2, WS_CHILD|WS_VISIBLE))
{
    TRACE0("Failed to create splitter window\n");
    return FALSE;
}
if (!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CWnd), CSize(200, 100), NULL))
{
    TRACE0("Failed to create CView1\n");
    return FALSE;
}
if (!m_wndSplitter.CreateView(0, 2, RUNTIME_CLASS(CWnd), CSize(500, 100), NULL))
{
    TRACE0("Failed to create CView2\n");
    return FALSE;
}

Ответы [ 2 ]

0 голосов
/ 22 января 2011

----------- | ---------- ||||||||| ---------- |||||||----------- | ---------- |

2 разделителя столбцов с правой стороной, имеющей 2 ряда, один Вверх и один Вниз и еще один с левой сторонывверх и вниз?

0 голосов
/ 28 декабря 2010

Не используйте CreateStatic, просто используйте Create на сплиттере. Тогда у вас есть так называемый динамический сплиттер, подробнее здесь .

При преобразовании сплиттера из horz в vert необходимо удалить виды из сплиттера и снова присоединить их. Вы должны сделать это в своем классе документов. Я могу опубликовать метод, чтобы сделать это, если это необходимо.

Хорошо, вот способ переключения видов на панели:

CView* CGMBefundDoc::SwitchToView(CView* pNewView,int row,int col)
{
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
CSplitterWnd* pSplitter = &pMainWnd->m_wndSplitter;

CView* pOldActiveView = reinterpret_cast<CView*>(pSplitter->GetPane(row,col));
ASSERT(pOldActiveView != pNewView);

// set flag so that document will not be deleted when view is destroyed
m_bAutoDelete = FALSE;    
// Dettach existing view
RemoveView(pOldActiveView);
// set flag back to default 
m_bAutoDelete = TRUE;

// Set the child window ID of the active view to the ID of the corresponding
// pane. Set the child ID of the previously active view to some other ID.
::SetWindowLong(pOldActiveView->m_hWnd, GWL_ID, 0);
::SetWindowLong(pNewView->m_hWnd,GWL_ID,pSplitter->IdFromRowCol(row,col));

// Show the newly active view and hide the inactive view.
pNewView->ShowWindow(SW_SHOW);
pOldActiveView->ShowWindow(SW_HIDE);

// Attach new view
AddView(pNewView);

// Set active 
pSplitter->GetParentFrame()->SetActiveView(pNewView);
pSplitter->RecalcLayout(); 

return pOldActiveView;
}

Надеюсь, вы поняли идею, иначе просто спросите.

...