Исправлено форматирование текста. — SchweinDeBurg
Недавно начал изучать MFC.
Возникла следующая проблема:
В SDI проекте разделяю окно на три части с помощью CSplitterWnd. Сначала вертикально, затем правую часть горизонтально.
|
|----
|
В каждой части создаю свой "вид". Вроде все замечательно, но при попытке передать сообщения каждому представлению из меню, доходит только до одного (левого). Для остальных ClassWithard честно создает обработчики, но команды не доходят. Подскажите в чем может быть дело.
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/,
CCreateContext* pContext)
{
if (!m_wndSplitter.CreateStatic(this, 1, 2))
{
TRACE0("Failed to CreateStaticSplitter\n");
return FALSE;
}
CRect rect;
GetClientRect(&rect);
// Создаем главный вид
if (!m_wndSplitter.CreateView(0, 0,
RUNTIME_CLASS(CSFView), CSize(rect.Width()-300, rect.Height()), pContext))
{
TRACE0("Failed to create first pane\n");
return FALSE;
}
//add the second splitter pane - which is a nested splitter with 2 rows
if (!m_wndSplitter2.CreateStatic(
&m_wndSplitter, // our parent window is the first 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 first splitter
))
{
TRACE0("Failed to create nested splitter\n");
return FALSE;
}
// Создаем вид для FlexGrid
if (!m_wndSplitter2.CreateView(0, 0,
RUNTIME_CLASS(CFGView), CSize(300, rect.bottom - 200), pContext))
{
TRACE0("Failed to create second pane\n");
return FALSE;
}
// Вид пока не понятно для чего
if (!m_wndSplitter2.CreateView(1, 0,
RUNTIME_CLASS(CSFView), CSize(300, 200), pContext))
{
TRACE0("Failed to create third pane\n");
return FALSE;
}
}
Убедительная просьба — использовать коды форматирования при вставке текстов программ.
[ posted via RSDN@Home 1.1.4 stable SR1 r568, accompanied by silence ]
Здравствуйте, KokS, Вы писали:
KS>Недавно начал изучать MFC.
KS>Возникла следующая проблема:
KS>В SDI проекте разделяю окно на три части с помощью CSplitterWnd. Сначала вертикально, затем правую часть горизонтально.
KS>KS> |
KS> |----
KS> |
KS>
KS>В каждой части создаю свой "вид". Вроде все замечательно, но при попытке передать сообщения каждому представлению из меню, доходит только до одного (левого). Для остальных ClassWithard честно создает обработчики, но команды не доходят. Подскажите в чем может быть дело.
Сообщения посылаются только активному представлению.
class CMainFrame : public CFrameWnd
{
......
CWnd *m_pLeftView;
CWnd *m_pRightTopView;
CWnd *m_pRightBottomView;
......
};
CMainFrame::CMainFrame ()
{
m_pLeftView = NULL;
m_pRightTopView = NULL;
m_pRightBottomView = NULL;
}
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext)
{
.....
// в конец функции добавляем
m_pLeftView = m_wndSplitter.GetPane (0, 0);
m_pRightTopView = m_wndSplitter2.GetPane (0, 0);
m_pRightBottomView = m_wndSplitter.GetPane (1, 0);
return TRUE;
}
BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
// расставляешь в порядке приоритета обработки коммандных сообщений видами
if ((m_pLeftView) && m_pLeftView->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
return TRUE;
if ((m_pRightTopView) && m_pRightTopView->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
return TRUE;
if ((m_pRightBottomView) && m_pRightBottomView->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
return TRUE;
return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}
BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam)
{
// расставляешь в порядке приоритета обработки коммандных сообщений видами
if ((m_pLeftView) && AfxCallWndProc (m_pLeftView, m_pLeftView->m_hWnd, WM_COMMAND, wParam, lParam))
return TRUE;
if ((m_pRightTopView) && AfxCallWndProc (m_pRightTopView, m_pRightTopView->m_hWnd, WM_COMMAND, wParam, lParam))
return TRUE;
if ((m_pRightBottomView) && AfxCallWndProc (m_pRightBottomView, m_pRightBottomView->m_hWnd, WM_COMMAND, wParam, lParam))
return TRUE;
return CFrameWnd::OnCommand(wParam, lParam);
}
Большое спасибо. Завтра на работе попробую.
Удалено избыточное цитирование. — SchweinDeBurg
Здравствуйте, KokS, Вы писали:
KS>В каждой части создаю свой "вид". Вроде все замечательно, но при попытке передать сообщения каждому представлению из меню, доходит только до одного (левого). Для остальных ClassWithard честно создает обработчики, но команды не доходят. Подскажите в чем может быть дело.
Нужно самому строить цепочку диспетчеризации посредством
либо
OnCmdMsg(...) //Для элементов управления глав. окна
Либо
OnWndMsg(...) //Для всех остальных
Обработчики созданные мастером для каждого вью будут работать только с элементами созданными в этом вью.
Вообще, если ваше приложение — SDI, то со сплитерами ооооччеень большой гемор

.
Здравствуйте, RealBobEx, Вы писали:
RBE>Обработчики созданные мастером для каждого вью будут работать только с элементами созданными в этом вью.
RBE>Вообще, если ваше приложение — SDI, то со сплитерами ооооччеень большой гемор
.
А как по другому сделать? Больше одного документа мне не надо. А вот видов надо несколько. Можно конечно все что я хочу разместить на одном виде, но это не красиво получиться

.
Строгое предупреждение за оверквотинг.
[ posted via RSDN@Home 1.1.4 stable SR1 r568, accompanied by silence ]