在处理了内置wxWidgets事件后,我可以运行代码吗?

Can I run code *after* a built-in wxWidgets event is handled?

本文关键字:运行 我可以 代码 处理 内置 wxWidgets 事件      更新时间:2023-10-16

我怀疑一定有一个内置的方法来做到这一点,但是我的Google-fu失败了。

我使用的是wxScrolledWindow,我必须在每次滚动窗口时在内容后面绘制未滚动背景图片。我做了一个这样的滚动处理程序…

void homewindow_t::onScroll(wxScrollEvent &evt) {
    Refresh();
    evt.Skip();
}

…这迫使它每次都重新绘制整个窗口。不幸的是,它在滚动处理之前绘制窗口,因此背景被重新绘制,然后向上或向下滚动,搞砸了对齐。文档表明Refresh只是使屏幕无效,这意味着滚动处理程序必须强制重新绘制。

我能看到的唯一解决这个问题的方法是自己处理滚动代码,如果没有必要,我宁愿不这样做。

想法,建议,线索…?

我发现在事件处理后运行代码的唯一通用解决方案是在跳过当前事件之前向事件队列发布第二个不同的事件(以便由默认处理程序处理),并在它出现时处理。

然而,仔细阅读wxWidgets源代码,我找到了我的具体问题的答案:有一个函数,wxScrolledWindow::EnableScrolling。虽然从名称上看不出来,但这将启用或禁用"物理滚动",这是强制即时重绘的原因。所以在窗口的构造函数中调用EnableScrolling(false, false);完全解决了这个问题。

要在wxScrolledWindow中绘制"固定"背景,您应该在绘制之前偏移DC原点以补偿滚动(然后将其重置),实际上根本不需要处理事件。

但是,如果你真的需要定义一个"post handler",那么有一种方法可以做到,请参阅这篇博客文章。虽然其中描述的API仅在wx 2.9.5中可用,但您可以在以前的wx版本中手动使用wxEVT_IDLE执行相同的操作。

相关文章: