C++ 什么';这是';对面';OnSetActive()的定义?

C++ 什么';这是';对面';OnSetActive()的定义?,c++,mfc,timer,C++,Mfc,Timer,我将一组PropertyPage与一个PropertyPage组合在一起(以创建选项卡式视图)。 其中一个页面在其OnSetActive()方法中启动计时器以刷新某些状态信息。 现在,如果我离开此选项卡并更改视图,我希望此计时器停止。“离开”选项卡后触发哪个事件? 我尝试了OnKillActive()、OnClose()和OnKillFocus(),但它们都没有按预期工作。有什么想法吗?为什么不简单地让一个计时器像您已经拥有的那样定期启动,并在计时器回调中获取当前活动选项卡,必要时进行刷新。为什

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

为什么不简单地让一个计时器像您已经拥有的那样定期启动,并在计时器回调中获取当前活动选项卡,必要时进行刷新。

为什么不简单地让一个计时器像您已经拥有的那样定期启动,并在计时器回调中获取当前活动选项卡,必要时进行刷新。

在文档中,OnKillActive应该正是您要查找的内容。如果在函数中设置断点,是否命中它

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


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

根据文档,OnKillActive应该正是您要查找的。如果在函数中设置断点,是否命中它

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


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

您要查找的函数是
virtual BOOL OnKillActive()
在激活另一个页面之前,它会在您离开的选项卡上调用 在这里,在工作中,我们使用它来验证用户是否可以更改页面,并通过返回false来防止页面更改


如果未触发该事件,如果您将您的
OnKillActive
标记为虚拟,则可以查看头文件。如果没有,事件将不会触发。

您正在查找的函数是
virtual BOOL OnKillActive()
在激活另一个页面之前,它会在您离开的选项卡上调用 在这里,在工作中,我们使用它来验证用户是否可以更改页面,并通过返回false来防止页面更改


如果未触发该事件,如果您将您的
OnKillActive
标记为虚拟,则可以查看头文件。如果没有,事件将不会触发。

好的,我们找到了一个有效的解决方案

void Status::OnShowWindow(BOOL bShow, UINT nStatus) {
    if (bShow == 0) {
        selectedDevice= NULL;   
        KillTimer(TIMER_ID);            }
    CMFCPropertyPage::OnShowWindow(bShow, nStatus);
}
OnShowWindow()
在进入和离开页面时调用, `bShow`是实际状态(输入时为true,离开时为false)

OnShowWindow()
声明为afx\u msg,并由\u WM\u SHOWWINDOW上的
事件触发


感谢您的帮助

好的,我们找到了一个有效的解决方案

void Status::OnShowWindow(BOOL bShow, UINT nStatus) {
    if (bShow == 0) {
        selectedDevice= NULL;   
        KillTimer(TIMER_ID);            }
    CMFCPropertyPage::OnShowWindow(bShow, nStatus);
}
OnShowWindow()
在进入和离开页面时调用, `bShow`是实际状态(输入时为true,离开时为false)

OnShowWindow()
声明为afx\u msg,并由\u WM\u SHOWWINDOW上的
事件触发


感谢您的帮助

根据文档,它应该这样做。OnKillActive()是虚拟的,是的。但我的断点并没有按照它应该这样做的文件。OnKillActive()是虚拟的,是的。但是我的断点没有命中,这就是我在阅读文档后所想的,不幸的是brekapoint没有命中。您的意思是,我应该使用此解决方案来获取活动窗口:[](不,我的意思是CPropertySheet::GetActivePage)。另请看我的更新。这就是我在阅读文档后的想法,不幸的是brekapoint没有命中。您的意思是,我应该使用此解决方案来获取活动窗口:[](不,我的意思是CPropertySheet::GetActivePage)。也可以看到我的更新。