如何关注MFC CSplitter中的某个视图

时间:2015-04-02 13:39:53

标签: mfc focus childviews csplitterwnd

我尝试使用CMDIChildWnd创建一个包含3个视图的分层窗口,2个CSplitterWnd&3和3个CFormView'

  1. 包含静态控件的表单视图
  2. 用于显示我用于查看PDF文档的主窗口的表单
  3. 与主视图相关的某些操作的侧面板
  4. 主分割器(包含MainView和TaskPane)初始化为1行和2列。 第二个拆分器包含2行1列,包含Tabs和主拆分器。

    此图描述了如何构建它: Visual description

    我的问题是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 个答案:

答案 0 :(得分:0)

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

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

因此覆盖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);
}        

我的代码只会在普通路由未处理后为每个可用视图提供每个命令。

答案 1 :(得分:0)

我找到了解决方案而且非常简单。 该对象包含分割器,是一个具有SetActiveView(CView * view)功能的CMDIChildWnd。

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

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

,而不是从CChildFrame :: OnCreateClient()事件中使用

SetActiveView(mainView);