相当于 X11 中的“无效矩形”/“WM_PAINT”

2023-11-24

我正在将一些代码从 Windows 移植到 XLib。在Windows代码中,我可以通过调用强制重绘InvalidateRect然后处理相应的WM_PAINT信息。但是,我无法找到如何在 X11/XLib 中执行此操作。我看到有一个Expose消息,但不确定这是否是同一件事。

如果重要的话,我需要这样做来强制窗口以特定的帧速率渲染基于 OpenGL 的程序。


为了稍微扩展 BЈовић 给出的有用答案,

使用原始 Xlib,您可以随时在单个线程中进行绘制,因为每个 Xlib 函数都指定完整的显示、窗口和上下文。 AFAIK,对于多线程,所有的赌注都消失了。

如果您处于桌面环境中,您还必须有一个 Expose 事件处理程序,并选择这些事件。即使您正在编写全屏程序,拥有一个也不会有什么坏处。

大多数工具包都不那么灵活,只能在指定的事件处理程序中绘制(但在许多其他方式中使用起来更好),并且具有与 Windows InvalidateRect 相同的功能。在原始 Xlib 中,您可以通过向自己发送 Expose 事件来获得相同的效果。这样做不会导致任何真正的性能问题,并且会使其他程序员更容易理解代码,并且更容易移植,所以您也可以这么做。

还有 XClearArea 和 XClearWindow 函数将为您生成 Expose 事件,但它们首先会擦除部分/全部背景颜色,这可能会导致闪烁。

使用 OpenGL 会变得更加复杂,因为您还必须使用 GLX。我在网上有一个非常简单的 OpenGL/Xlib 程序http://cs.anu.edu.au/~hugh.fisher/3dteach/作为一个例子可能有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

相当于 X11 中的“无效矩形”/“WM_PAINT” 的相关文章

随机推荐