【问题标题】:How to focus on a certain view in a MFC CSplitter如何专注于 MFC CSplitter 中的某个视图
【发布时间】:2015-06-07 11:54:22
【问题描述】:

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

  1. 包含静态控件的表单视图
  2. 用于显示我用于查看 PDF 文档的主窗口的表单
  3. 与主视图相关的一些操作的侧面板

主拆分器(包含 MainView 和 TaskPane)初始化为 1 行和 2 列。 第二个拆分器包含 2 行 1 列,包含选项卡和主拆分器。

这张图片描述了它应该如何构建:

我的问题是 MainView 没有焦点,因此工具栏按钮未启用缩放、另存为等...

当我不使用横幅拆分器时,它可以正常工作。 我尝试了 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);

【问题讨论】:

    标签: mfc focus childviews csplitterwnd


    【解决方案1】:

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

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

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

    然后从 CChildFrame::OnCreateClient() 事件中使用

    SetActiveView(mainView);
    

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-14
        相关资源
        最近更新 更多