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

What's the fastest way to update an owner drawn control?

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

我试过使用定时器,但问题是定时器单独运行最多每秒 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();
}

根据您的控件的实现方式,"repaint" 函数可能很简单:

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

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