OnSetActive() 的“对立面”是啥?
Posted
技术标签:
【中文标题】OnSetActive() 的“对立面”是啥?【英文标题】:What's the 'opposite' of OnSetActive()?OnSetActive() 的“对立面”是什么? 【发布时间】:2012-01-18 14:53:28 【问题描述】:我有一堆 PropertyPages 与一个 PropertyPage 粘在一起(以创建一个选项卡式视图)。 其中一个页面在其 OnSetActive() 方法中启动一个计时器以刷新一些状态信息。 现在,如果我离开此选项卡并更改视图,我希望此计时器停止。 “离开”选项卡后会触发哪个事件? 我已经尝试过 OnKillActive()、OnClose()、OnKillFocus(),但它们都没有按预期工作。有什么想法吗?
【问题讨论】:
【参考方案1】:根据文档,OnKillActive 应该正是您正在寻找的。如果你在函数中放置一个断点,你会命中它吗?
通常,当您离开选项卡时,该选项卡仍处于活动状态并在后台等待。您可以继续等待计时器消息,如果您不是活动选项卡,则忽略它。
编辑:您在 cmets 中说 OnKillActive 没有被调用。 MFC 的优点之一是 Microsoft 为您提供了可供浏览的源代码;在 CPropertyPage::OnNotify 中生成对 OnKillActive 的调用。有几个条件会导致它在到达那个点之前提前返回。一个是对 CDialog::OnNotify 的调用,其中包含可疑的注释“允许消息映射覆盖”。这意味着如果您有自己的 WM_NOTIFY 的 OnNotify 处理程序,并且它返回 TRUE,则将跳过默认处理。
【讨论】:
这就是我阅读文档后的想法,不幸的是,断点没有被击中。你的意思是,我应该使用这个解决方案来获取活动窗口:[](***.com/questions/510845/…) 不,我的意思是 CPropertySheet::GetActivePage。另请参阅我的更新。【参考方案2】:为什么不简单地使用一个定期触发的计时器,就像您已经拥有的一样,并在计时器回调中获取当前活动选项卡并在必要时刷新。
【讨论】:
【参考方案3】:好的,我们找到了可行的解决方案
void Status::OnShowWindow(BOOL bShow, UINT nStatus)
if (bShow == 0)
selectedDevice= NULL;
KillTimer(TIMER_ID);
CMFCPropertyPage::OnShowWindow(bShow, nStatus);
OnShowWindow()
在进入和离开页面时被调用,
`bShow` 是实际状态(进入时为真,离开时为假)
OnShowWindow()
被声明为 afx_msg 并由 ON_WM_SHOWWINDOW
事件触发
感谢大家的帮助
【讨论】:
【参考方案4】:你要找的函数是virtual BOOL OnKillActive()
在激活另一个页面之前,它会在您要离开的选项卡上调用
在这里,在工作中,我们使用它来验证用户是否可以更改页面并通过返回 false 来阻止页面更改。
如果事件没有被触发,如果您将OnKillActive
标记为虚拟,也许您可以查看您的头文件。否则,该事件将不会触发。
【讨论】:
根据文档,它应该这样做。 OnKillActive() 是虚拟的,是的。但我的断点没有命中以上是关于OnSetActive() 的“对立面”是啥?的主要内容,如果未能解决你的问题,请参考以下文章
Bootstrap 4 中 .flex-fill 的对立面是啥?