Какой самый быстрый способ обновить нарисованный владельцем элемент управления?
У меня есть владелец нарисованный элемент управления, который отображает данные. Данные меняются со временем. Мне нужно найти быстрый способ постоянно обновлять контроль.
Я пытался использовать таймеры, но проблема в том, что один таймер работает с максимальной скоростью 65 кадров в секунду. И если метод рисования элемента управления требует времени, fps становится довольно низким.
Я попытался запросить обновление (InvalidateRect) из метода рисования элемента управления, таким образом он перерисовывает элемент управления сотни раз в секунду, однако остальная часть пользовательского интерфейса не работает должным образом (например, кнопки не обновляются, всплывающие подсказки и т.д.).
Как правильно обновлять элемент управления, нарисованный владельцем, как можно быстрее, при этом сохраняя отзывчивость интерфейса?
PS Мне нужно это для работы с GDI, поэтому я не могу использовать OpenGL/Direct3D для отображения моих данных.
1 ответ
Если вы хотите обновить его буквально как можно быстрее, запустите цикл обработки сообщений, который не ожидает ввода. Если вы продолжите обрабатывать сообщения, пользовательский интерфейс останется отзывчивым, но когда сообщений не будет, ваш элемент управления продолжит обновлять.
Псевдопользователей-код:
while (!fQuit)
{
while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
DispatchMessage(&msg);
RepaintControl();
}
В зависимости от того, как реализован ваш элемент управления, функция "перекрасить" может быть простой:
RedrawWindow(hwndControl, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW);
Если вы обнаружите, что это слишком сильно загружает вашу машину (хотя с многоядерным процессором все должно быть в порядке) или обновляется слишком быстро, вы можете использовать выжидательный таймер, чтобы получить обновление с более высоким разрешением, но при этом время от времени возвращать управление. См. Использование объектов ожидаемого таймера для получения подробной информации о ожидаемых таймерах.