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 中创建视图?