Pull to refresh

Comments 14

может я один такой, но я этот эффект вообще не догоняю
Обратите внимание на высоту non-client области под заголовком. Теперь туда можно вписать нужные контролы, например, как это делает Explorer в Vista. Остальная графика будет размещена в клиентской части окна (ниже), автоматически учитывая отступ.

Для особых минималистов можно вообщн сделать все окно non-client с одной кнопкой :)
по поводу «Принцип понятен» так и хочется повторить действия Бората из одноименного фильма, а именно помахивая рукой произнести «НЕОЧЕНЬ»
Чего то ничерта непонятно, чего именно вы сделали.
Вообще, я бы сократил статью до «используйте DwmExtendFrameIntoClientArea из DwmApi.dll» и кому нужно, тот бы понял о чем речь. Автор же разжувал все подробно, наделал картинок, упомянул что неплохо бы проверить версию винды. И все равно находятся люди, которые не въезжают. У фигею, дорогая редакция.
Я не понял чего всё таки получили в итоге? То что и за внутренним пространством окна теперь размыто? Если да, то прекращаю махать рукой :/
Именно. Размытость (Aero Glass) в клиенской области окна. По умолчанию Aero Glass применяется только к заголовку окна.
Ох конечно круто, но насколько я помню по давнему общению с Вистой, клиентская область там вообще непрозрачная. Возникает вопрос: «какой смысл от размытости, если она однородна по цвету и непрозрачна?»
Слушай, модет у тебя просто картинки выключены, что ты не врубаешься о чем речь?
Для примера, окно Центра мобильной связи Windows выполнено в подобном стиле.
В статье я старался изложить именно сам принцип того как это сделать, поэтому приношу свои извинения за минимализм и урывки кода.
Сделал я следующее:
1. Проверил версию системы (>=Windows Vista).
2. Объявил внешнюю API функцию DwmExtendFrameIntoClientArea, которая используется системой для эффекта.
3. Вызываю функцию перед появлением окна.
4. Фон области «стекла» зарисовал черным цветом. Камнем преткновения является то, что GDI не понимает alpha-blending, и если просто вызвать API функцию, вместо эффекта будет черный цвет. Для решения этой проблемы рисуем область черным цветом. Поскольку битовый паттерн RGB черного цвета (0x00000000) такой же как и битовый паттерн для 100% прозрачного ARGB, эффект работает.
Да что ж это сегодня за день мемуаров по мотивам MSDN и Win7 Dev Blog?

а) Самый интересный момент в WinForms — полный абзац с прорисовкой контролов на стеклянной области -был тактично опущен :)
б) Каждый раз кисть создавать (и не диспоузить) — это как-то совсем расточительно.
в) Ну и давно есть WPF, который потрясающе работает с альфа-каналом без всяких извращений.
a) Согласен что могут возникнуть проблемы например с лейблами черного цвета — текст не будет виден, так как он черный и поэтому будет прозрачен. Для того чтобы черный цвет отображался корректно, нужно заставить контрол использовать GDI+ а не GDI, т.е. установить UseCompatibleTextRendering в значение true. Глобально можно установить через Application.SetCompatibleTextRenderingDefault, которое по умолчанию устанавливается в false для поддержки старых контролов. Также можно рисовать ручками используя GDI+.
б) Верно замечено, плохой пример кода, Dispose конечно нужен, или, что лучше, нужно использовать статическую кисть Brushes.Black. Исправлю.
в) Первый раз я использовал эффект в WPF, в котором всё действительно проще, достаточно установить Background=«Transparent», а не закрашивать при перерисовке черным. К сожалению, в WinForms свойство TransparencyKey и в managed коде SetLayeredWindow API не дают желаемого результата, поэтому приходится вот так извращаться с перерисовкой.
В WPF нет встроенной поддержки эффекта, в нём тоже нужно непосредственно вызывать API функцию. В отличие от WinForms у него нет проблем с альфа каналом, поэтому достаточно установить свойство окна Background как Transparent. Однако, в WPF есть один неприятный момент при вызове данной API функции: нужно DPI, систему измерения в WPF, вручную преобразовать в пиксельную систему измерения.
Sign up to leave a comment.

Articles