【问题标题】:Can I run code *after* a built-in wxWidgets event is handled?我可以在处理内置 wxWidgets 事件后运行代码吗?
【发布时间】:2011-07-22 02:15:56
【问题描述】:

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

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

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

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

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

想法、建议、线索...?

【问题讨论】:

    标签: c++ event-handling wxwidgets


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      但是,如果您确实需要定义“后处理程序”,那么有一种方法可以做到,请参阅this blog post。虽然其中描述的 API 仅在 wx 2.9.5 中可用,但您可以在之前的 wx 版本中手动使用 wxEVT_IDLE 执行相同的操作。

      【讨论】:

      • 原来的问题是,一旦背景被绘制出来,wxWidgets 会滚动它而不调用我的代码重新绘制它;我把它画在了正确的地方。 wxScrolledWindow::EnableScrolling 解决了这个问题。新的CallAfter 听起来也可以解决问题,就像我最初设想的那样。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2018-04-25
      • 1970-01-01
      • 2012-12-20
      • 2016-09-22
      • 1970-01-01
      • 2011-12-07
      • 2015-06-17
      相关资源
      最近更新 更多