По поводу CSplitterWnd - здесь есть свои тонкости - MFC не дает создать с помощью Class Wizard класс, унаследованый от CSplitterWnd. Так что, далаем класс CSplitterWndEx наследованным от CWnd (generic CWnd).
Затем проходимся по получившимся файлам и меняем CWnd на CSplitterWnd.
Дальше - Вам нужно заблокировать передвижение сплиттера - смотрим в оригинал - WINSPLIT.CPP (находится в папке с MFC - по умолчанию это C:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC\) и думаем что можно сделать:))
Посмотрев на работу можно сделать следующие выводы - 1. При нажатии на него отображается линия перемещения. 2. При подведении мышки к нему меняется курсор.
Значит нам нужно в своем CSplitterWndEx переписать обработчики нажатия на левую кнопу и перемещения мыши. Смена курсора - это обычно WM_SETCURSOR - но, если посмотреть в WINSPLIT.CPP, то они там в обработчике этого сообщения ничего не меняют. Курсор меняется только при нажатии и перемещении мышки (в OnLButtonDown и OnMouseMove).
Так что нужно всего лишь сделать пустыми в своей реализации CSplitterWndEx эти два метода:
Код:
void CSplitterWndEx::OnLButtonDown(UINT nFlags, CPoint point)
{
// CSplitterWnd::OnLButtonDown(nFlags, point);
}
void CSplitterWndEx::OnMouseMove(UINT nFlags, CPoint point)
{
// CSplitterWnd::OnMouseMove(nFlags, point);
}
Создание сплиттера -
Код:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
CRect rect;
GetWindowRect(rect);
if (!m_wndSplitter.CreateStatic(this, 1, 2))
return FALSE;
if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CTestSplitterView), CSize(rect.Width()/2, rect.Height()), pContext))
return FALSE;
if (!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CTestSplitterView), CSize(rect.Width()/2, rect.Height()), pContext))
return FALSE;
m_bSplitterInit = TRUE;
return TRUE;
}
Ну и можно сделать автомасштабирование видов при изменении размеров главного окна. Нужно сделать обрабочик сообщения WM_SIZE в CMainFrm - здесь важный момент, что при создании сплиттера (CSplitterWnd::CreateStatic) шлется сообщение WM_SIZE, а сам сплиттер еще до конца нами и не определен (виды то не добавили:)). Поэтому в мейнфрейм добавляем флажок m_bSplitterInit, а в OnSize проверяем это дело -
Код:
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);
if (m_bSplitterInit)
{
CRect rect;
GetWindowRect(rect);
m_wndSplitter.SetRowInfo(0, cy, 0);
m_wndSplitter.SetColumnInfo(0, rect.Width()/2, 50);
m_wndSplitter.SetColumnInfo(1, rect.Width()/2, 50);
m_wndSplitter.RecalcLayout();
}
}