2

我正在尝试使用 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);
4

2 回答 2

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);
}        

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

于 2015-04-02T13:57:15.943 回答
0

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

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

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

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

SetActiveView(mainView);
于 2015-04-05T06:36:40.767 回答