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() 的“对立面”是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 一对多关系上的保存方法的对立面是啥?

Bootstrap 4 中 .flex-fill 的对立面是啥?

请教ac68u梅林固件里的几个选项是啥意思

leetcode中的AC是啥意思,是否像DP这样的算法技术?

听力检查ac38,bc28是啥意思

TP-LINK路由器AC是啥意思