В моем приложении есть несколько многоуровневых окон, которые используют UpdateLayeredWindow()
для обработки их визуального представления. Согласно статье MSDN о многослойных окнах , «при использовании UpdateLayeredWindow()
приложению не нужно отвечать на WM_PAINT
или другие сообщения рисования». У них были одни и те же обработчики сообщений, что и у неуровневых окон, поэтому я решил, что просто рано вернусь из обработки WM_PAINT
, если целью является многоуровневое окно.
Конечно, это вызвало одну серьезную проблему: если одно из многоуровневых окон получило сообщение WM_PAINT
, входная очередь в конечном итоге будет заполнена бесконечным потоком WM_PAINT
сообщений. Этот конечный результат имеет смысл, так как окно никогда не будет проверено, и поэтому оно будет думать, что ему нужно рисовать (я не должен возвращаться из обработчика без проверки или BeginPaint()
ing и т. Д.), Но что не имеет смысл, поэтому он получил сообщение в первую очередь, поскольку он не влияет на окно, которое использовало UpdateLayeredWindow()
.
Это даже не произойдет надежно - просто время от времени, и не каждый раз, когда пиксели окна нуждаются в перерисовке. Разумность была восстановлена путем возврата к DefWindowProc()
, когда многослойное окно получило сообщение WM_PAINT
, но я чувствую, что происходит что-то, чего я не понимаю. И учитывая, как редко эта проблема проявлялась, я боюсь, что это может быть просто скрытие еще более тонкой проблемы. Ожидается ли поведение окна, использующего UpdateLayeredWindow()
, для получения случайного сообщения WM_PAINT
? Имеет ли это значение, если я правильно с этим обращаюсь?
Дополнительная информация, если необходимо: окно вызывает UpdateLayeredWindow()
сразу после создания, а затем остается само по себе (оно больше не вызывает, поскольку не изменяется). Использование C ++ и Win32 API, без MFC.