Как сфокусироваться на определенном виде в MFC CSplitter

Я пытаюсь создать иерархическое окно, которое содержит 3 представления, используя CMDIChildWnd, 2 CSplitterWnd и 3 CFormView:

  1. Представление формы, содержащее статический элемент управления
  2. Форма для отображения главного окна, которое я использую для просмотра PDF документа
  3. Боковая панель для некоторых действий, связанных с основным видом

Основной разделитель (содержащий 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);
}        

Мой код будет просто предлагать каждую команду каждому доступному представлению после того, как оно не было обработано обычной маршрутизацией.

Другие вопросы по тегам