2013-05-15 37 views
3

在我的wxWidgets(wxPython)应用程序中,如果有任何更改,我使用50 ms计时器进行一些轮询并更新窗口。如果检测到更改,它会调用wxWindow.Refresh来更新窗口,并且在EVT_PAINT处理程序中完成小部件的实际更新。如果用户没有看窗口,我可以禁用绘画和/或定时器。但是,即使窗口被图标化或隐藏在不同的窗口后面,EVT_PAINT仍然被解雇。wxwidgets有可能确定窗口当前是否可见?

有什么办法可以检测窗口当前是否在屏幕上不可见,或防止EVT_PAINT事件被不必要地触发?

IsActive方法和EVT_ACTIVATE事件来测试窗口是否有焦点,但我想继续更新窗口,如果它是未聚焦,但仍然可见。 wxWindow.IsShown系列函数没有帮助,它们仍然为隐藏/图标化窗口返回True。

+0

我有同样的问题:使用wxTimer重复更新小部件,但如果窗口不可见,则不应更新小部件,例如放置在不活动的wxNotebook选项卡中。我可以在事件处理程序中使用IsShownOnScreen来停止任何进一步的事件,但一旦用户可以看到,就无法再次启动它。 – Jonatan

回答

0

IsShownOnScreen()可以帮助图标化的情况。 编辑:但实际上不

或者您可以捕获wxEVT_ICONIZE以检测窗口何时最小化。

但说实话,我很惊讶刷新隐藏在另一个窗口后面的窗口仍然会导致重新绘制。如果前面的窗口不透明,这真的不应该发生。

+0

不起作用。这正是我尝试刷新计时器的原因。 –

+0

IsShownOnScreen只检查alement及其父母是否隐藏。它不检查窗口的状态。 –

+0

对不起,在这种情况下,'IsShownOnScreen()'确实无法正常工作(至少恕我直言,它应该像我写的一样工作,但是,现在它不会)。 'wxEVT_ICONIZE'绝对可以。 –