在处理了内置wxWidgets事件后,我可以运行代码吗?
Can I run code *after* a built-in wxWidgets event is handled?
我怀疑一定有一个内置的方法来做到这一点,但是我的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
执行相同的操作。
相关文章:
- 我可以在运行时重新定义在 OpenCascade/OCCT 标头中定义的 c++ 静态常量吗?
- 我可以根据用户输入在运行时生成"循环"吗?
- C++:我可以在线程仍在运行时为线程提供新值,还是必须先结束它?
- 为什么我无法成功运行以下刽子手游戏机代码?我可以在 devc++ 中成功运行相同的代码
- 我可以在不创建项目的情况下在Visual Studio 2019中编译和运行HelloWorld.cpp吗?
- 使用 dev-c++ 运行我的 GIS 应用程序可以"gdal201.dll is missing"
- 我可以在开关(消息)语句的同时运行一段时间吗?(C )
- 如何在不将其连接到终端的情况下运行'screen',以便我可以在C++ (qt) 应用程序中捕获输出?
- (如何)我可以使用LLVM机器代码分析器预测代码片段的运行时间
- 在我可以从终端中可以单击程序,无法通过单击程序来运行程序
- 我可以在Azure上运行本机C 二进制
- 我可以在运行时更改 Log4Qt 配置的文件名吗?
- 我可以在任何平台上运行 C 和 C++ 吗?
- 为什么我可以选择*不*调用并发::代理::d一个内部运行
- 我可以/应该在 GPU 上运行统计应用程序的这段代码吗?
- 我是一个菜鸟,但是我可以编写一个带有gui的c ++程序,并让它在Visual Studio 2010 express和ubuntu中的终端上运行吗?
- 无论如何,我可以在visualstudio2005上与visualstudio2015一起运行一个已经编码的项目吗
- 如何使用visual studio 2015创建一个.exe,我可以在桌面上运行
- 我可以从 NTFS 分区在 Ubuntu 中运行C++项目吗?
- 我可以将一个可执行文件与另一个可执行文件(Windows 服务程序)组合在一起,并将该程序作为逻辑服务运行吗?