2015-04-02 16 views
2

我试图创建一个包含使用的CMDIChildWnd,2级CSplitterWnd的和3的CFormView的3次的分级窗口:如何专注于某一观点在MFC CSplitter

  1. 包含静态控制表单视图
  2. 甲形式来显示,我使用查看PDF文件
  3. 针对与主视图

主分离器的一些动作的侧板(含有的MainView和泰斯主窗口kPane)初始化为1行2列。 第二个拆分器包含2行1列,包含Tabs和主分离器。

此图片介绍应该如何构建的: Visual description

我的问题是,的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); 

回答

0

我已经找到了解决方案,这是非常简单的。 该对象包含分路器是具有SetActiveView(CView的*视图)功能的的CMDIChildWnd。

所以我试着用得到的观点:

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

,比从CChildFrame使用::的OnCreateClient()事件

SetActiveView(mainView); 
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); 
}   

我的代码只是在每个可用视图没有被正常路由处理之后提供每个命令。