问题描述
我在 CChildFrame
中添加了导航侧边栏,方法是在其中创建 CSplitterWnd
并添加 CScrollView
和 CListView
作为基于 {{3} 的拆分器窗格}.有教科书的方法来做到这一点吗?我之所以这么问是因为我遇到了多种副作用,例如文档名称不再显示在应用程序标题栏中或鼠标滚轮不再适用于 CScrollView
。
我想,我需要以某种方式重定向到达我的 CChildFrame
的消息,以使我的 CScrollView
成为 CView
相关消息的默认接收器,因为 CSplitterWnd
中断了流程,因为它不是从 CView 派生的。有人能指出我正确的方向吗?
(注意:这仍然是在 VS 2008 中完成的。)
更新:我刚刚针对应用程序窗口标题更新问题创建了一个单独的问题:this answer
解决方法
这些代码示例并不是最合适的,因为它们创建的是 CWnd
派生的窗格,而不是 CView
派生的窗格。视图与文档没有某种关联。您需要调用 CDocument::AddView()
方法,将您创建的每个视图添加到文档的视图列表中。 pContext
参数包含指向文档以及其他成员的指针。
将下面的代码放在您的文档类中,以验证您的视图是否已正确创建并关联到文档:
POSITION pos = GetFirstViewPosition();
while (pos)
{
CView *pVw = GetNextView(pos);
AfxMessageBox(typeid(*pVw).name(),MB_OK | MB_ICONINFORMATION);
}
也在每个视图类中:
CDocument *pDoc = GetDocument();
if (pDoc) AfxMessageBox(pDoc->GetTitle(),MB_OK | MB_ICONINFORMATION);
else AfxMessageBox("The view has no associated Document!");
注意: CChildFrame
类的默认实现调用 CSplitterWnd::Create()
而不是 CSplitterWnd::CreateStatic()
来创建拆分窗口,如果将拆分窗口移动到最终它会破坏视线之外的窗格。然后,如果您将其移回,它会使用文档模板或现有视图中的信息再次创建它们。如果您最终创建了一个动态拆分器窗口,您可能也需要覆盖此行为。最好检查您使用的版本的 MFC 源。
分离器和视图之间似乎存在关于鼠标滚轮的历史干扰:https://forums.codeguru.com/showthread.php?42826-BUG-CSplitterWnd-Mouse-Wheel
我不会将此标记为解决方案,因为我不完全理解背景,但目前这是一种解决方法:
BOOL CMyScrollViewDerivedClassInTheStaticSplitter::OnMouseWheel(UINT nFlags,short zDelta,CPoint pt)
{
// CSplitterWnd prohibits mousewheel somehow. Doing it explicitely here:
CPoint pos = GetScrollPosition();
pos.y -= zDelta;
ScrollToPosition(pos);
return CScrollView::OnMouseWheel(nFlags,zDelta,pt);
}