c++ - 重绘分层窗口的正确方法

标签 c++ winapi graphics layered-windows

我有一个用 WS_EX_LAYERED 创建的窗口窗口样式。我目前正在使用 GDI+ 绘制内存位图,并使用 UpdateLayeredWindow更新分层窗口的图形内容。我打算将此窗口用作我的应用程序的主窗口,这将需要它经常重绘。

看到分层窗口没有收到 WM_PAINT窗口消息[?] ,我需要想出一个合适的方法来重新绘制窗口。优化不是必要的,但鱼与熊掌总是好的。因此,我正在寻找“正确”的使用方法。

到目前为止,这是我的想法:

  • 我猜想在 BitBlt 之前渲染到离屏位图上是个好主意。 ing 或类似内容。

  • 每秒渲染 60 帧应该(超过?)足够了(但这与其他应用程序的帧速率相比如何?)。

可能的解决方案:

  • 使用 SetTimer发送 WM_TIMER定期发送消息。

    • 很有用,因为通过指定超时值,我可以达到我想要的每秒帧数,而无需测量渲染“帧”所需的持续时间。

    • 由于消息的频率和速度,可能会导致输入或其他延迟。

  • 仅在特定事件发生时渲染帧,例如窗口调整大小。

    • 需要我找出所有需要重绘的事件。

    • 会大大减少渲染的不必要帧的数量。

  • 当消息队列中没有消息时渲染帧,通过检查 PeekMessage .

    • 可能会减慢窗口消息的处理速度。

    • 这将导致 CPU 使用率过高,因为正在处理的帧数超出了需要。

  • 创建一个新线程来执行渲染循环。

    • 必须执行时序计算以保持稳定的帧速率。

最佳答案

分层窗口不会收到窗口可见性更改后会生成的 WM_PAINT 消息,但它根本不会阻止它们收到此消息。

你可以继续使用InvalidateRect改变窗口更新区域,在你的窗口过程中等待WM_PAINT,在位图中绘制内容并调用UpdateLayeredWindow 更改窗口内容。您可以使用此方法在窗口内容发生变化时请求重绘,例如,当按下按钮或调整窗口大小(或激活/停用)时。

关于c++ - 重绘分层窗口的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19217211/

相关文章:

android - Qt 无法创建目录

c++ - 控制台内容

java - 如何向我的 fillRect 添加长文本?

c++ - QDateTime::fromString 返回无效日期,我错过了什么?

c++ - 单元测试线程: how to confirm that a thread was blocked

windows - Windows API 中是否有一种方法可以在特定应用程序运行时触发代码?

cocoa - 使用 NSBezierPath 时切换线条属性

java - 图形循环故障,如何解决?

C++ 使用 char 输入到 int 终止循环

delphi - 找出哪个进程注册了全局热键? (Windows API)