Как сфокусироваться на определенном виде в MFC CSplitter
Я пытаюсь создать иерархическое окно, которое содержит 3 представления, используя CMDIChildWnd, 2 CSplitterWnd и 3 CFormView:
- Представление формы, содержащее статический элемент управления
- Форма для отображения главного окна, которое я использую для просмотра PDF документа
- Боковая панель для некоторых действий, связанных с основным видом
Основной разделитель (содержащий MainView и TaskPane) инициализируется 1 строкой и 2 столбцами. Второй разделитель содержит 2 строки и 1 столбец, содержащий вкладки и основной разделитель.
Это изображение описывает, как это должно быть построено:
Моя проблема в том, что MainView не имеет фокуса, и поэтому кнопки панели инструментов не включены для масштабирования, сохранения как и т. Д.
Когда я не использую Banner Splitter, он работает нормально. Я попробовал setActivePane() setFocus() setActiveWindow() Вот как я создаю его в CChildFrame::OnCreateClient()
if (m_BannerSplitter->CreateStatic(this, 2, 1))
{
m_BannerSplitter->CreateView(0,
0,
RUNTIME_CLASS(CBannerView),
CSize(r.Width(),28),
pContext);
m_splitter->CreateStatic(m_BannerSplitter,
1,
2,
WS_CHILD | WS_VISIBLE | WM_SHOWWINDOW,
m_BannerSplitter->IdFromRowCol(1,0));
}
else
{
m_splitter->CreateStatic(this, 1, 2);
}
m_splitter->CreateView(0,
0,
RUNTIME_CLASS(CMainView),
CSize(r.Width()-m_splitter->m_iRightTabFullWidth-14,1),
pContext);
m_splitter->CreateView(0,
1,
RUNTIME_CLASS(CTasksView),
CSize(m_splitter->m_iRightTabFullWidth, 1),
pContext);
m_splitter->SetColumnInfo(1,
m_splitter->m_iRightTabFullWidth,
m_splitter->m_iRightTabFullWidth);
2 ответа
Я нашел решение, и это было довольно просто. Объект, содержащий разделители, представляет собой CMDIChildWnd, который имеет функцию SetActiveView(CView * view).
Поэтому я попытался получить представление с помощью:
CView *mainView = (CView *)m_splitter->GetDlgItem(m_splitter->IdFromRowCol(0, 0));
и чем используется из события CChildFrame::OnCreateClient()
SetActiveView(mainView);
Проблема в том, что команда маршрутизации всегда проверяет активное представление, за которым следует документ.
Если все команды должны обрабатываться соответствующим представлением, независимо от того, какое представление находится в фокусе, просто реализуйте свою собственную командную маршрутизацию.
Так что перезаписать CMainFrame::OnCmdMsg.
BOOL CMainFrame::OnCmdMsg(UINT nID,int nCode,void* pExtra,AFX_CMDHANDLERINFO* pHandlerInfo)
{
// Do the standard routing (View, Frame, Application)
if (__super::OnCmdMsg(nID,nCode,pExtra,pHandlerInfo))
return TRUE;
// If not handled ask all other views to handle the command
return m_pBannerView->OnCmdMsg(nID,nCode,pExtra,pHandlerInfo) ||
m_pMainView->OnCmdMsg(nID,nCode,pExtra,pHandlerInfo) ||
m_pTaskView->OnCmdMsg(nID,nCode,pExtra,pHandlerInfo);
}
Мой код будет просто предлагать каждую команду каждому доступному представлению после того, как оно не было обработано обычной маршрутизацией.