如何专注于 MFC CSplitter 中的某个视图

How to focus on a certain view in a MFC CSplitter

我正在尝试使用 CMDIChildWnd、2 个 CSplitterWnd 和 3 个 CFormView 创建一个包含 3 个视图的分层 window:

  1. 包含静态控件的窗体视图
  2. 显示我用来查看 PDF 文档的主要 window 的表单
  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);

问题是命令路由总是检查文档后面的活动视图。

如果所有命令都应由适当的视图处理,则无论哪个视图具有焦点,只需实现您自己的命令路由即可。

所以覆盖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);
}        

我的代码将在正常路由未处理后向每个可用视图提供每个命令。

我找到了解决方案,而且非常简单。 包含拆分器的对象是具有 SetActiveView(CView * view) 函数的 CMDIChildWnd。

所以我尝试使用以下方法获取视图:

CView *mainView = (CView *)m_splitter->GetDlgItem(m_splitter->IdFromRowCol(0, 0)); 

并且比 CChildFrame::OnCreateClient() 事件中使用的

SetActiveView(mainView);