我尝试使用CMDIChildWnd创建一个包含3个视图的分层窗口,2个CSplitterWnd&3和3个CFormView'
主分割器(包含MainView和TaskPane)初始化为1行和2列。 第二个拆分器包含2行1列,包含Tabs和主拆分器。
此图描述了如何构建它:
我的问题是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);
答案 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);