Имеются две фазы обновления окна. В первой фазе, при выводе окна, Windows посылает ему сообщение WM_ERASEBKGND, оповещающее о необходимости стирания фона перед процедурой рисования. Затем посылается сообщение WM_PAINT, служащее сигналом для закрашивания «переднего плана».
Тем не менее, вы можете пропустить первую фазу, которая вызывает мерцание, одним из двух способов.
Первый заключается в том, что вы форсируете обновление сами, с помощью вызова функции Windows API InvalidateRect. На входе он получает дескриптор окна, указатель на закрашиваемую область – (передаем nil, если надо отрисовать всю область окна) и третий параметр, сообщающий о необходимости очистки фона. Вот как раз последний параметр и должен содержать значение False, если вы сами будете в методе Paint полностью отрисовывать всю область:
InvalidateRect(Handle, Nil, False);Handle должен быть дескриптором формы или элемента управления.
Второй способ избежать мерцания заключается в использовании функций VCL. Можно указать VCL не стирать фон, добавляя [csOpaque] к значению свойства ControlStyle, как показано ниже:
ControlStyle := ControlStyle + [csOpaque];Это ограничивает заполнение фона, но процесс «наполнения» области изображением, т. е. процесс рисования, все еще можно наблюдать. В этом случае от эффекта «мигания» можно избавиться, рисуя на TBitmap и выводя его затем на экран командой CopyRect.
[News Group]