Я работаю над программой, которая требует, чтобы WM_ERASEBKGND был отключен (чтобы избежать мерцания).
Проблема возникает, когда мое главное окно теряет фокус, а другое окно (другая программа) получает фокус.
Окно с фокусом (не моя программа) делает недействительным окно МОЕЙ программы каждый раз, когда оно проходит над ним! В результате экран моего окна становится белым везде, где мимо него проходит другое окно, после чего оно почти полностью остается пустым. Очевидно, у меня не может быть программы, в которой экран становится белым каждый раз, когда теряет фокус.
Есть ли способ продолжить операции рисования моего окна (например, продолжить вызов wm_paint) даже после того, как мое окно потеряло фокус (WM_KILLFOCUS)?
Прежде всего, из комментариев выше, никогда Отправить WM_PAINT
вручную с SendMessage
или же PostMessage
, использование InvalidateRect
поручить окну перекрасить.
О WM_ERASEBKGND
возвращаемое значение используется для обозначения WM_PAINT
обработчик того, что фон был стерт, в случае, если процедура рисования может быть оптимизирована. Чтобы на самом деле предотвратить стирание фона, просто не звоните DefWndProc()
для этого сообщения. Или даже проще, установите hbrBackground
в NULL
в окне класса.
Как уже упоминалось, фокус не имеет ничего общего с перекрашиванием, и ваше окно должно нормально рисовать даже в фоновом режиме.
Других решений пока нет …