MFC:调用 CView::OnInitalUpdate() 后调用哪个 CFrameWnd 函数?
Posted
技术标签:
【中文标题】MFC:调用 CView::OnInitalUpdate() 后调用哪个 CFrameWnd 函数?【英文标题】:MFC: Which CFrameWnd function is called after CView::OnInitalUpdate() is called? 【发布时间】:2019-09-05 02:18:56 【问题描述】:我有一个 MFC 应用程序,它使用 CSplitterWnd
创建多窗格视图。该过程在CFrameWnd::OnCreateClient()
调用中完成。之后,在某些时候,各种视图都会调用它们的CView::OnInitialUpdate()
函数。其中一个视图是CTreeView
,另一个是CListView
,在OnInitialUpdate()
中设置了多个列。我需要设置默认的CTreeView Item
,它也会更新CListView
。但是,如果我在OnInitialUpdate
中设置默认值,CListView
尚未设置各个列。因此,完成所有操作后,我似乎需要设置默认的CTreeView Item
。我想我会在一些CFrameWnd
回调中这样做。我的问题是我应该在什么时候这样做?
TIA!
【问题讨论】:
OnInitialUpdate()
在初始化期间被框架调用一次。显示您的代码,并突出显示哪些内容不适合您。
框架将为所有视图调用OnInitialUpdate()
,您无法控制调用它们的顺序(可能文档模板或视图的创建顺序会影响它,但没有记录) .一个简单的解决方法是在设置CListView
后向CTreeView
发布自定义消息,并设置CTreeView
以响应该消息,而不是OnInitialUpdate()
。
好吧,我把它移到了OnShowWindow()
。这给了我现在需要的东西。
【参考方案1】:
您的视图之间似乎存在依赖关系;那是不对的。 数据应该存储在文档中(即使是当前选择,如果它应该在视图之间共享)。 负责更改的视图应该调用 CDocument::UpdateAllViews()。结果,所有其他视图 OnUpdate() 都将被调用。
请看https://docs.microsoft.com/en-us/cpp/mfc/reference/cview-class?view=vs-2019
【讨论】:
这是因为类别窗口窗格最终发送了所选树项已更改的消息,因此列表视图最终会自行更新但为时过早(它尚未创建其列)。所以现在,我暂时在OnShowWindow()
中移动了选择顶部/根树项。不知道是否有某种类型的OnInitalUpdateComplete()
回电。以上是关于MFC:调用 CView::OnInitalUpdate() 后调用哪个 CFrameWnd 函数?的主要内容,如果未能解决你的问题,请参考以下文章