【问题标题】:MFC: how to fix an MDI after replacing the CView with a CSplitterWnd having two CView-derived classes in the panesMFC:如何在用窗格中具有两个 CView 派生类的 CSplitterWnd 替换 CView 后修复 MDI
【发布时间】:2021-02-09 13:42:40
【问题描述】:

我在CChildFrame 中添加了一个导航侧边栏,方法是在其中创建一个CSplitterWnd,并添加一个CScrollView 和一个CListView 作为基于this answer 的拆分窗格。有教科书的方法吗?我之所以问,是因为我遇到了多个副作用,例如文档名称不再显示在应用程序标题栏中或鼠标滚轮不再适用于 CScrollView

我想,我需要以某种方式重定向到达我的CChildFrame 的消息,以使我的CScrollView 成为CView 相关消息的默认接收者,因为CSplitterWnd 中断了流程,因为它不是从CView 派生的。有人能指出我正确的方向吗?

(注意:这仍然在 VS 2008 中完成。)

更新:我刚刚为应用程序窗口标题更新问题创建了一个单独的问题:MFC: After applying a CSplitterWnd to my CChildFrame the main window title isn't updated any more

【问题讨论】:

    标签: mfc mdi


    【解决方案1】:

    这些代码示例不是最合适的,因为它们创建的是CWnd-derived 窗格,而不是CView-derived 窗格。视图在某种程度上与文档没有关联。您需要调用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 源代码。

    【讨论】:

    • 我明确需要一个静态拆分器,因为我有不同的看法。感谢您的回答,但正如您从屏幕截图中看到的那样,`CDocument::AddView() 显然已在某处被调用(使用与m_wndSplitter.CreateView() 一起传递的 pContext)作为文档中的数据显示。也许要求教科书清单将拆分器窗口无缝集成到子框架中要求太高了。即使这个很好的教程也没有提供任何线索:salils.tripod.com/MFC_Tutorials/ch03.htm——我想,我会在这里创建单独的问题来处理我遇到的每个副作用。
    【解决方案2】:

    分离器和视图之间似乎存在历史上关于鼠标滚轮的干扰: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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多