如何专注于 MFC CSplitter 中的某个视图
How to focus on a certain view in a MFC CSplitter
我正在尝试使用 CMDIChildWnd、2 个 CSplitterWnd 和 3 个 CFormView 创建一个包含 3 个视图的分层 window:
- 包含静态控件的窗体视图
- 显示我用来查看 PDF 文档的主要 window 的表单
- 与主视图相关的一些操作的侧面板
主拆分器(包含 MainView 和 TaskPane)初始化为 1 行和 2 列。
第二个拆分器包含 2 行和 1 列,包含选项卡和主拆分器。
这张图片描述了它应该如何构建:
我的问题是 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);
问题是命令路由总是检查文档后面的活动视图。
如果所有命令都应由适当的视图处理,则无论哪个视图具有焦点,只需实现您自己的命令路由即可。
所以覆盖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);
}
我的代码将在正常路由未处理后向每个可用视图提供每个命令。
我找到了解决方案,而且非常简单。
包含拆分器的对象是具有 SetActiveView(CView * view) 函数的 CMDIChildWnd。
所以我尝试使用以下方法获取视图:
CView *mainView = (CView *)m_splitter->GetDlgItem(m_splitter->IdFromRowCol(0, 0));
并且比 CChildFrame::OnCreateClient() 事件中使用的
SetActiveView(mainView);
我正在尝试使用 CMDIChildWnd、2 个 CSplitterWnd 和 3 个 CFormView 创建一个包含 3 个视图的分层 window:
- 包含静态控件的窗体视图
- 显示我用来查看 PDF 文档的主要 window 的表单
- 与主视图相关的一些操作的侧面板
主拆分器(包含 MainView 和 TaskPane)初始化为 1 行和 2 列。 第二个拆分器包含 2 行和 1 列,包含选项卡和主拆分器。
这张图片描述了它应该如何构建:
我的问题是 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);
问题是命令路由总是检查文档后面的活动视图。
如果所有命令都应由适当的视图处理,则无论哪个视图具有焦点,只需实现您自己的命令路由即可。
所以覆盖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);
}
我的代码将在正常路由未处理后向每个可用视图提供每个命令。
我找到了解决方案,而且非常简单。 包含拆分器的对象是具有 SetActiveView(CView * view) 函数的 CMDIChildWnd。
所以我尝试使用以下方法获取视图:
CView *mainView = (CView *)m_splitter->GetDlgItem(m_splitter->IdFromRowCol(0, 0));
并且比 CChildFrame::OnCreateClient() 事件中使用的
SetActiveView(mainView);