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 函数?的主要内容,如果未能解决你的问题,请参考以下文章

mfc 时钟 OnTimer 非静态成员函数的非法调用

MFC怎么调用API函数?

如何用wpf调用mfc程序呢?

MFC:调用 CView::OnInitalUpdate() 后调用哪个 CFrameWnd 函数?

VC6 如何调用MFC类

mfc线程里面调用的套接字库会不会随着线程结束而自动释放?