Самый важный совет, который я могу вам дать, - ограничить количество обновлений строки состояния до 10 или 20 в секунду. Больше просто вызовет ненужное мерцание, без какой-либо выгоды для пользователя - они все равно не могут обрабатывать информацию так быстро.
ОК, с этим в стороне: если вы хотите использовать расширенный стиль WS_EX_COMPOSITED
для строки состояния, у вас есть три основных варианта:
Создайте класс-потомок, который переопределяет метод CreateParams()
, и либо установите его в свою среду IDE, либо (если вы не хотите использовать его в качестве собственного компонента в среде IDE), создайте строку состояния во время выполнения.
Создайте дочерний класс с тем же именем TStatusBar
в другом модуле, переопределите метод CreateParams()
и добавьте этот модуль после ComCtrls
к элементам формы, используя элементы управления в строке состояния. Это создаст экземпляр вашего собственного TStatusBar
класса вместо класса ComCtrls
. См. этот ответ для другого примера техники, надеюсь, она достаточно ясна.
Используйте класс vanilla TStatusBar
и установите расширенный стиль WS_EX_COMPOSITED
во время выполнения.
Я предпочитаю третий вариант, как самый простой для экспериментов, поэтому вот пример кода:
procedure TForm1.FormCreate(Sender: TObject);
var
SBHandle: HWND;
begin
// This only works on Windows XP and above
if CheckWin32Version(5, 1) then begin
// NOTE: the following call will create all necessary window handles
SBHandle := StatusBar1.Handle;
SetWindowLong(SBHandle, GWL_EXSTYLE,
GetWindowLong(SBHandle, GWL_EXSTYLE) or WS_EX_COMPOSITED);
end;
end;
Edit:
Если вы хотите, чтобы ваш код должным образом поддерживал последние версии Windows и визуальные стили, вам даже не следует думать о том, чтобы обрабатывать WM_ERASEBKGND
самостоятельно - обычная техника включает пустой обработчик для этого метода и рисование фона в обработчике WM_PAINT
, Это действительно не работает для стандартных элементов управления, таких как TStatusBar
, так как фон должен быть нарисован где-то . Если вы просто пропустите рисование фона в обработчике WM_ERASEBKGND
, вам нужно будет использовать нарисованные владельцем панели, охватывающие всю строку состояния , в противном случае фон просто не будет отрисован, и окно под ним будет просвечивать Кроме того, код для нарисованной владельцем панели, вероятно, будет очень сложным.
Опять же, гораздо лучше было бы распутать путаницу в размещенном вами коде, должным образом отделить работника от отображаемого кода и снизить скорость обновления текстов строки состояния до чего-то разумного. Просто нет никакого смысла проходить мимо количества обновлений монитора в секунду, и даже это имеет смысл только для игр и подобных визуализаций.