Здравствуйте, 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. Вы можете изменить на все, что угодно свое, в т.ч. и просто константы.