【问题标题】:What's the 'opposite' of OnSetActive()?OnSetActive() 的“对立面”是什么?
【发布时间】:2012-01-18 14:53:28
【问题描述】:

我有一堆 PropertyPages 与一个 PropertyPage 粘在一起(以创建一个选项卡式视图)。 其中一个页面在其 OnSetActive() 方法中启动一个计时器以刷新一些状态信息。 现在,如果我离开此选项卡并更改视图,我希望此计时器停止。 “离开”选项卡后会触发哪个事件? 我已经尝试过 OnKillActive()、OnClose()、OnKillFocus(),但它们都没有按预期工作。有什么想法吗?

【问题讨论】:

    标签: c++ mfc timer


    【解决方案1】:

    根据文档,OnKillActive 应该正是您正在寻找的。如果你在函数中放置一个断点,你会命中它吗?

    通常,当您离开选项卡时,该选项卡仍处于活动状态并在后台等待。您可以继续等待计时器消息,如果您不是活动选项卡,则忽略它。

    编辑:您在 cmets 中说 OnKillActive 没有被调用。 MFC 的优点之一是 Microsoft 为您提供了可供浏览的源代码;在 CPropertyPage::OnNotify 中生成对 OnKillActive 的调用。有几个条件会导致它在到达那个点之前提前返回。一个是对 CDialog::OnNotify 的调用,其中包含可疑的注释“允许消息映射覆盖”。这意味着如果您有自己的 WM_NOTIFY 的 OnNotify 处理程序,并且它返回 TRUE,则将跳过默认处理。

    【讨论】:

    • 这就是我阅读文档后的想法,不幸的是,断点没有被击中。你的意思是,我应该使用这个解决方案来获取活动窗口:[](stackoverflow.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() 是虚拟的,是的。但我的断点没有命中
        猜你喜欢
        • 2015-09-23
        • 1970-01-01
        • 2021-03-19
        • 2013-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多