Области окон против слоистых окон

Я ищу создание пользовательской скругленной рамки для окна приложения (border-radius и shadow) С точки зрения производительности, какой метод лучше всего подходит для этого?

а. Используйте области (SetWindowRgn) для округленного окна приложения и многоуровневое окно (UpdateLayeredWindow) для тени.

б. Используйте многослойные окна как для округленного окна приложения, так и для тени.

Документы для UpdateLayeredWindow указывают:

Для лучшей производительности рисования многослойным окном и любыми нижележащими окнами многослойное окно должно быть как можно меньше.

Я спрашиваю это специально для главного окна приложения, поэтому большое окно, которое может иметь высокую сложность и в большинстве случаев видно на экране.

Должен ли я идти с регионами или многослойным окном для окна приложения? Какой из них будет легче на процессоре / памяти?

1 ответ

SetWindowRgn отключает DWM для данного окна. DWM - это компонент, который отвечает за качественное рисование рамки окна с использованием доступного графического оборудования. Это должно в значительной степени исключать SetWindowRgn, Также, SetWindowRgn дает очень "древние" результаты, потому что сглаживание невозможно. Пиксель может быть либо полностью прозрачным, либо полностью непрозрачным.

Для лучшей производительности рисования многослойным окном и любыми нижележащими окнами многослойное окно должно быть как можно меньше.

Я считаю, что в 2018 году этот намек менее актуален. Документация была написана 18 лет назад, когда аппаратное обеспечение было более ограниченным, чем сегодня.

Еще, UpdateLayeredWindow это не самый быстрый способ рисования пользовательских оконных рам, особенно когда вам приходится часто обновлять растровое изображение (например, при изменении размера окна). Узким местом является то, что эти обновления должны идти из системной памяти в графическую память. Чтобы минимизировать размер окна, создайте четыре маленьких окна, которые достаточно велики, чтобы нарисовать границы / углы вашего окна. Этот трюк потянул Visual Studio, например. Используя Spy++, можно увидеть 4 экземпляра "VisualStudioGlowWindow", которые представляют собой многослойные окна шириной всего 9 пикселей (в моей системе):

Если вы хотите максимальной производительности, вы также можете посмотреть на прямую композицию в сочетании с WS_EX_NOREDIRECTIONBITMAP расширенный стиль окна, как описано в статье " Высокопроизводительное наложение окон с помощью Windows Composition Engine". Эта техника требует Windows 8 по крайней мере.

Другие вопросы по тегам