windows - 更新所有者绘制的控件的最快方法是什么?

标签 windows winapi graphics gdi ownerdrawn

我有一个显示数据的所有者绘制的控件。数据随时间变化。我需要找到一种快速的方法来持续更新控件。

我试过使用定时器,但问题是定时器本身的运行速度最多为每秒 65 帧。如果控件的 paint 方法需要时间,fps 会变得很低。

我尝试从控件的绘制方法请求更新 (InvalidateRect),这样它每秒重新绘制控件数百次,但是 UI 的其余部分无法正常工作(例如,按钮未更新,工具提示被卡住等) .

尽快更新所有者绘制控件的正确方法是什么,同时仍保持 UI 响应?

P. S. 我需要这个来使用 GDI,所以我不能使用 OpenGL/Direct3D 来显示我的数据。

最佳答案

如果你想尽可能快地更新它,运行一个不等待输入的消息循环。如果您继续处理消息,UI 将保持响应,但当没有任何消息时,您的控件将继续更新。

伪代码:

while (!fQuit)
{
    while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
        DispatchMessage(&msg);
    RepaintControl();
}

根据您的控件的实现方式,“重绘”功能可能很简单:

RedrawWindow(hwndControl, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW);

如果您发现这会使您的机器停滞不前(虽然多核应该没问题)或者更新太快,您可以使用等待计时器来获得更高分辨率的更新虽然有时仍会屈服于控制。参见 Using Waitable Timer Objects有关可等待计时器的详细信息。

关于windows - 更新所有者绘制的控件的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31039254/

相关文章:

c++ - 如何使用 C++/C++11 打印当前时间(以毫秒为单位)

linux - 为什么现代操作系统(Linux、Windows、Solaris)要实现一对一线程模型?

python - 用 Pygame 画抛物线

windows - 如何在 Windows Server 上找到我的 SSH 公钥?

python - 导入错误 : DLL load failed: %1 is not a valid Win32 application - paramiko

c++ - 连接函数错误 10047 (winsock2)

c - 如何在不使用 select() 的情况下在特定套接字和特定端口上超时?

c++ - XInput 360 Controller 不适用于 cocos2d-x

r - 在图的子集之间添加额外的间距

iphone - CGContextAddArc 真的那么慢吗(与用几条线绘制的圆相比)