НОВЫЙ ответ: Переопределите WndProc и заблокируйте сообщение WM_PAINT, пока вы применяете новые свойства окна.
СТАРЫЙ ответ: Переопределите WndProc и заблокируйте сообщение WM_ERASEBKGND
.
Объяснение того, что делает код ниже:
Когда область окна становится недействительной, Windows отправляет в элемент управления серию сообщений, в результате которых появляется недавно нарисованный виджет. Раннее сообщение в этой серии - WM_ERASEBKGND
. Обычно, в ответ на это сообщение, элемент управления окрашивает себя в сплошной цвет. Позже, в ответ на сообщение WM_PAINT
(которое обычно используется нами в событии OnPaint), фактическое рисование выполняется. Если этот рисунок нетривиален, перед обновлением виджета будет задержка, и вы получите раздражающее мерцание.
Глядя на ваш код снова, я явно решал другую проблему. Попробуйте этот новый пример. Он заблокирует рисование формы / элемента управления, если флаг bAllowPaint
не установлен.
Пример NEW :
private const int WM_PAINT = 0x000F;
protected override void WndProc(ref Message m)
{
if ((m.Msg != WM_PAINT) ||
(bAllowPaint && m.Msg == WM_PAINT))
{
base.WndProc(ref m);
}
}
Пример СТАРЫЙ :
private const int WM_ERASEBKGND = 0x0014;
protected override void WndProc(ref Message m)
{
if (m.Msg != WM_ERASEBKGND) // ignore WM_ERASEBKGND
{
base.WndProc(ref m);
}
}