MFC:将 CSplitterWnd 应用到我的 CChildFrame 后,主窗口标题不再更新

Posted

技术标签:

【中文标题】MFC:将 CSplitterWnd 应用到我的 CChildFrame 后,主窗口标题不再更新【英文标题】:MFC: After applying a CSplitterWnd to my CChildFrame the main window title isn't updated any more 【发布时间】:2021-02-13 14:08:42 【问题描述】:

仍然使用 VS 2008,我在 CChildFrame 中拆分了 MDI 视图类,以便使用静态拆分器 (source code) 在旧 CScrollView 旁边的导航侧边栏 (CListCtrl)。然而,这暗示了两个副作用:除了鼠标滚轮不再工作 (where I found a workaround for),应用程序窗口不再更新 SetPathName()。我需要做些什么来桥接拆分器,以便框架根据我的CDocument 再次更新应用程序窗口?

【问题讨论】:

你在哪里调用 SetPahName()?并且必须设置样式 FWS_ADDTOTITLE。 FWS_ADDTOTITLE 在框架中设置。在我应用拆分器之前,它起作用了,因为 FWS_ADDTOTITLE 在 MDI 应用程序中是默认设置。我试图用它调用 CSplitterWnd::CreateStatic() ,但它没有改变任何东西。 SetPahName() 在我的 CDocument 类中被调用,例如在 OnNewDocument() 或 OnFileSaveAs() 中。 在您的 MainFrame 类上,只需在其中放置一个方法 void CMyFrame::OnUpdateFrameTitle(BOOL bAddToTitle) __super::OnUpdateFrameTitle(bAddToTitle); 和一个断点,看看会发生什么。如果需要,您必须提供自己的覆盖,而不是调用 __super 实现。 经过漫长的对分搜索后,在注释掉 FWS_ADDTOTITLE 样式后,我得到了窗口标题恢复正常,我一定是在 TomTom 的评论后添加了 PreCreateWindow()。我无法恢复我所做的所有其他更改。其中之一肯定解决了文档标题问题…… 【参考方案1】:

在你的 MainFrame 类上,放一个方法

void CMyFrame::OnUpdateFrameTitle(BOOL bAddToTitle)

    __super::OnUpdateFrameTitle(bAddToTitle);

在那里设置一个断点,看看会发生什么。如果需要,您必须提供自己的覆盖,而不是调用 __super 实现。

【讨论】:

CMDIFrameWnd::OnUpdateFrameTitle 中查询GetActiveDocument() 时,它总是返回NULL。因此,用两个CView 派生类替换我的CScrollView 以某种方式破坏了文档和框架的连接。这是因为CFrameWnd::GetActiveView() 从未显示过活动视图。我还在CChildFrame::OnCreateClient 中添加了SetActivePane()SetActiveView(),但没有任何改变。 PS:CMainFrame::OnUpdateFrameTitle() 在添加覆盖后被多次调用。窗口标题中仍然只显示应用程序名称,没有文档名称。 现在您必须深入了解调用堆栈以了解更多详细信息。 我尽可能地挖掘。问题是:我必须在哪里重写什么函数来设置活动文档,以便框架可以再次找到它,而无需阅读完整的 MFC 源代码? CFrameWnd::GetActiveDocument 函数上设置断点:i.imgur.com/WaLX09m.png 以查看返回的内容。

以上是关于MFC:将 CSplitterWnd 应用到我的 CChildFrame 后,主窗口标题不再更新的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MFC 中动态拆分窗口而不使用 CSplitterWnd::Create

有没有办法在不使用(MFC)动态对象创建的情况下在 CSplitterWnd 中创建视图?

MFC单文档分割区(CSplitterWnd)

MFC 窗口分割与通信

MFC:我们怎样才能轻松地从 CTreeCtrl 切换到 CTreeView?

在 MFC 中拥有一个简单视图和一个拆分视图