Телефон: +7 (926) 245-03-63

Рисование без мерцания

Следующая статья: Переключение языка.

Почему изображение мерцает, если я вызываю метод Repaint или Refresh, а не OnPaint напрямую? Или это просто «вариация на тему»?

Имеются две фазы обновления окна. В первой фазе, при выводе окна, 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.

Интересное в интернете: Уральский завод модульных зданий - бытовки дачные. Бытовки строительные.