微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MFC:如何在将 CView 替换为在窗格中具有两个 CView 派生类的 CSplitterWnd 后修复 MDI

如何解决MFC:如何在将 CView 替换为在窗格中具有两个 CView 派生类的 CSplitterWnd 后修复 MDI

我在 CChildFrame添加了导航侧边栏方法是在其中创建 CSplitterWnd添加 CScrollViewCListView 作为基于 {{3} 的拆分器窗格}.有教科书的方法来做到这一点吗?我之所以这么问是因为我遇到了多种副作用,例如文档名称不再显示在应用程序标题栏中或鼠标滚轮不再适用于 CScrollView

screenshot

我想,我需要以某种方式重定向到达我的 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);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。