С выходом новой операционной системы, у Microsoft изменились приоритеты в дизайне - теперь у интерфейса появились анимации, да и в целом он стал менее острым. В данной статье я поделюсь некоторыми фишками, с которыми столкнулся в процессе работы с WinAPI.
Все параметры в этой статье появились с выходом сборки 22000. И используются с помощью DWM, вызывая функцию DwmSetWindowAttribute
.
Оформление Mica
Mica - это новый стиль в Windows 11, пришедший на замену Fluent. По словам Microsoft, он разрабатывался так, что бы дать пользователю максимальную производительность. В отличие от своего предшественника, Mica можно включить в WinApi приложениях без особых костылей.
Сделать это можно, используя переменную, которая официально не задокументирована - DWMWA_MICA_EFFECT
. Она имеет значение 1029
.
Вот как его использовать на практике:
#define DWMWA_MICA_EFFECT DWORD(1029); // Mica
int useMica = 1;
DwmSetWindowAttribute(hwnd, DWMWA_MICA_EFFECT, &useMica, sizeof(int));
К сожалению, Microsoft сообщили, что в будущих релизах Windows данный способ работать не будет.
Поэтому, начиная со сборки 22523, на смену пришёл другой способ, с небольшим бонусом в виде новых стилей:
const auto DWMSBT_DISABLE = 1 // Default
const auto DWMSBT_MAINWINDOW = 2 // Mica
const auto DWMSBT_TRANSIENTWINDOW = 3 // Acrylic
const auto DWMSBT_TABBEDWINDOW = 4 // Tabbed
DwmSetWindowAttribute(hwnd,
DWMWA_SYSTEMBACKDROP_TYPE, &DWMSBT_MAINWINDOW,
sizeof(int));
Параметр не имеет ограничений по использованию, поэтому его можно натянуть на любое окно. (Этим воспользовались в Microsoft, и наконец немного изменили дизайн проводника)
Для C#, например, существует несколько библиотек, нацеленных на симулирование элементов управления из Mica в WPF.
Изменение цвета окна
Продолжаем список изменений в Dwm... Следующим идёт небольшой набор параметров для изменения цвета заголовка, текста на нём, и границ самого окна.
DWMWA_CAPTION_COLOR
- Цвет заголовкаDWMWA_TEXT_COLOR
- Цвет текста в заголовкеDWMWA_BORDER_COLOR
- Цвет границы окна
Вот небольшой пример использования:
#define DWMWA_BORDER_COLOR DWORD(34)
#define DWMWA_TEXT_COLOR DWORD(36)
#define DWMWA_CAPTION_COLOR DWORD(35)
auto caption = RGB(45, 80, 45);
auto text = RGB(20, 180, 180);
auto border = RGB(255, 0, 0);
DwmSetWindowAttribute(hwnd, DWMWA_CAPTION_COLOR, &caption, sizeof(COLORREF));
DwmSetWindowAttribute(hwnd, DWMWA_TEXT_COLOR, &text, sizeof(COLORREF));
DwmSetWindowAttribute(hwnd, DWMWA_BORDER_COLOR, &border, sizeof(COLORREF));
В результате может получиться такой вот кошмар дизайнера...
Кстати, это нововведение уже долгое время использует десктопный клиент Telegram.
Стоит сказать, что до появления всех этих параметров, приходилось создавать своё оформление окна, рисовать кнопки, накидывать на это обработку сообщения WM_NCHITTEST, а так же решать проблемы с анимацией Aero... В общем, жить стало проще.
Закругление окна
Вам не нравятся новые закруглённые окна в Windows 11? Тогда у Microsoft есть решение - параметр DWMWA_WINDOW_CORNER_PREFERENCE
!
У него есть целых три значения:
0
/2
- Обычный3
- Чуть закруглённый1
- Квадратный
#define DWMWA_WINDOW_CORNER_PREFERENCE DWORD(33);
const auto DWMWCP_DONOTROUND = 1; // Rectangular
const auto DWMWCP_ROUND = 2; // Default
const auto DWMWCP_ROUNDSMALL = 3; // Semi-rounded
DwmSetWindowAttribute(hwnd,
DWMWA_WINDOW_CORNER_PREFERENCE, &DWMWCP_DONOTROUND,
sizeof(int));
Возможно, этот параметр был добавлен Microsoft для личного использования. Ведь если развернуть окно на половину или четверть экрана, то его углы так же станут квадратными.
Заключение
Это не все нововведения в кастомизации внешнего вида окон. "За кадром" остались параметры для изменения толщины границы, и отзеркаливания всего окна. Но это очень специфические возможности, о которых я решил не рассказывать.
Надеюсь, для кого-то эта статья окажется полезной.
Комментарии (42)
sidorovmax
29.03.2022 23:18Забавно, что системная регулировка толщины границы окна была в Windows 3.1, но была отменена в Windows 95 и далее. А тут, значит, настройку вернули.
Huskers Автор
30.03.2022 01:20+1На самом деле, своеобразную регулировку толщины можно было реализовать и в Windows 7, благодаря Aero (кстати, тоже с Dwm). А вот в XP и ниже, как я знаю, всё украшение окна рисуется картинкой
napa3um
30.03.2022 21:36Вроде не отменяли, всегда настраивалась толщина рамки на любых оформлениях (и в классических, и во всех навесных начиная с XP, в 10 не смотрел).
hardtop
29.03.2022 23:53А почему такая странная разрядка: иконка приложения имеет почти одинаковый отступ сверху и слева, а вот "крестик" закрытия окна гораздо сильнее отстоит от правого края.
Vest
30.03.2022 00:01+1Думаю, что «они-художники так видят». Я в своё время одного дизайнера спросил про некрасивые отступы, и получил похожий ответ.
hardtop
31.03.2022 00:00Через призму опыта хотел сказать, что это плохой ответ. Художник выражает свой взгляд (со своими акцентами). Художник может гипертрофировать, искать свой стиль.
Дизайнер - должен решать задачу. И должен уметь объяснить, "зачем" и "почему".
Huskers Автор
30.03.2022 10:39+5Чем дольше всматриваешься, тем больше недостатков замечаешь... Тут вот, например, кнопки не ровно стоят
Эта проблема появляется при масштабировании интерфейса, и тянется ещё с Windows 10
hardtop
31.03.2022 00:05Это, конечно, грустно. Почему в эпоху, когда у телефонов разрешение экрана больше, чем у ноутбука, майки не могут перерисовать интерфейс. Ну, или хотя бы начать...
firehacker
31.03.2022 11:39Я ещё со времён висты/семёрки кричал, что все выравнивания элементов везде, где только можно, похерены.
Но все молча проглотили. Хорошая же ОС, аэро-фигаэро, чо там!
BkmzSpb
01.04.2022 11:27Я сначала не поверил. Открыл Explorer, и вы оказались правы. Спрведливости ради, это похоже на артефакт каких-то WinApi приложений. Например, такие же проблемы имеют многие "классические" приложения, но не "современные". Все равно бред, особенно после выпуска brand new версии Windows.
Huskers Автор
01.04.2022 16:40Да, вы правы, все приложения, которые используют "кастомные" кнопки, не имеют этой проблемы. К ним относятся UWP, Electron, IDE JetBrains, и т.д.
nidalee
30.03.2022 18:02«крестик» закрытия окна гораздо сильнее отстоит от правого края.
Есть подозрение, что он там еще и некликабельный. Это чтобы можно было схватить окно за угол, а не заголовок, и изменить его размеры Snap-ом.
У меня в браузере, когда открыта куча вкладок, схватиться реально больше не за что.
А вот насчет кривости и косости иконок не знаю что сказать.hardtop
31.03.2022 00:08Много табов - тут сам пользователь решает. Я просто открываю 3-7 браузеров по темам (и в каждом по 4-10 табов). Но почему разметка кривая - не ясно.
Den3M
30.03.2022 01:21+7Чем им не угодили темы Windows ? Все же было. :(
А теперь унификация дизайна с закосом то ли под WEB, толи под Mobile (Android ?). Не контрастные окна сероватого цвета, в которых без напряжения глаз ничего не видно. Зато уголки закруглили.Huskers Автор
30.03.2022 01:29Большая часть внешнего вида, которая сейчас есть в Windows 11, появилась ещё пару лет назад в отдельной версии Windows для Surface Duo. Видимо, в Microsoft поступило много положительных отзывов о новом дизайне, что они решили полностью изменить внешний вид своей основной системы.
Поэтому, да, этот дизайн можно считать в каком-то роде мобильным
dartraiden
30.03.2022 03:36Чем им не угодили темы Windows? Все же было. :(
Темы это такая штука, что лучше бы их не было. Например, для использования сторонних тем пользователи обожают патчить системные файлы (поскольку тема не подписана, а разрешать неподписанные темы — здоровенная дыра в безопасности), что переводит систему из состояния «тестировалась хоть как-то» в состояние «конфигурация не тестировалась производителем никогда». Ну и все прочие прелести сторонних тем в виде «эта тема подходит только для 19H2, ни в коем случае не пытайтесь использовать её в 20H1, иначе получите чёрный экран».KivApple
30.03.2022 10:12+3Так это вопрос кривой реализации системы тем, если установка темы оформления может скомпрометировать систему и отсутствует обратная совместимость.
Если бы тема оформления представляла собой набор картинок и конфигураций, а не являлась обычным исполняемым файлом, то таких проблем не было бы.
dartraiden
30.03.2022 23:31Да, но перепиливать оконный менеджер (или кто там отвечает за натягивание темы), возможно, означает, «реализовать отныне и впредь обратную совместимость тем, но сломать что-то более фундаментальное», а на это Microsoft ни за что не пойдёт.
ZimM
30.03.2022 20:58Обьясните, почему неподписанные темы - здоровенная дыра в безопасности? Как набор картинок и параметров для рисования этих картинок может быть дырой в безопасности? Вы вот сейчас на хабре сидите, неподписанный доверенным центром сертификации CSS скачиваете. Опасносте?
dartraiden
30.03.2022 23:28Тема это не просто набор картинок, а исполняемый файл, в ресурсах которого содержатся уже сами картинки. Когда ты Microsoft, то любая проблема кажется решаемой с помощью формата PE.
А ещё темы допускают подгрузку удалённых ресурсов, где нас поджидают сюрпризы.
Поэтому, лучше бы не было никакой реализации тем, чем такая, где юзеры радостно патчат системные файлы, чтобы воткнуть недоверенные темы от неизвестного Васяна с deviantart.ZimM
31.03.2022 00:55Из вашей ссылки на вики:
> .msstyles files are 32 bit PE files, however they don't contain code or ordinary data. Instead they store all style information in resources.
Т.е. все-таки это просто набор картинок и данных, который по неведомой причине запихали в РЕ заместь какого-нибудь zip-архива?
redsh0927
01.04.2022 07:40Запрет на запуск неподписанного чего-либо — это смерть свободы и превращение компьютера в быдлодевайс
FluD
30.03.2022 07:44+11я всё не перестану задавать один и тот же вопрос, зачем они запретили классическую тему, под капотом она всё еще там и нет причин её запрещать.
чтоб посмотреть на классическую тему достаточно в winlogon удалить все handle с названием Theme* и перезапустить explorer
El_Kraken_Feliz
30.03.2022 08:45+6Потому что тогда Вы не сможете получить "нью юзер экспириэнс"
Зачем Вам этот экспириэнс нужен, я не имею ни малейшего понятия, но все делают так - значит надо
sundmoon
30.03.2022 13:06+1Потому что получается вендорлок. Правильно, Вам он не нужен.
Большинство нетехнических юзеров страдает от "нью юзер экспириенса" молча, большинство типа-виндузятников ищут способы оставаться на "десятке", "семёрке" а то и на XP, хотя бы визуально.
Мне лично пофиг - но к сожалению потому, что я отношусь к редчайшему психотипу "дискретов" (vs. визуалы-аудиалы-кинестетики). Стили окошек, "темы" и прочий "фронтенд" волнуют меня меньше всего. Хотя... и меня можно вывести из себя явно непрофессиональным вредительством, вроде тёмных окон без рамки на тёмном же фоне.
Warhammer_iii
30.03.2022 23:42А можете чуть подробнее раскрыть пожалуйста? Нужно переходить, но новые интерфейсы это лютая боль.
zartarn
31.03.2022 10:25Проблема что классическая тема не использует GPU + в драйверах подзабивают на реализацию 2D GDI что приводит к графическим багам и т.д. Вот тут длинная эпопея по этой теме https://jeyndoe.github.io/edump/pages/action=vthread&forum=12&topic=25612&page=0.html
Torvald3d
30.03.2022 12:53Изменение цвета окна
А можно как-то изменить цвет у всех окон приложения? То есть чтобы не приходилось при создании очередного окна вызывать этот код, а применить его глобально один раз, по умолчанию, чтобы все существующие и новые окна были с измененным заголовком?
kb31
30.03.2022 15:29+3Mica можно включить в WinApi приложениях без особых костылей.
Сделать это можно, используя переменную, которая официально не задокументирована.
Как же вы недооцениваете чудовищность этого костыля
Huskers Автор
30.03.2022 15:43Учитывая то, что эта переменная не задокументирована, она не вошла в обиход. Большинство из тех людей, кто пользовался Mica помимо тестов, скорее всего знают про её изменения в будущих сборках.
(Так, единственная мне известная реализация Mica в WPF уже использует два варианта включения)
kb31
30.03.2022 17:30Да, следующий абзац я прочитал. Вопрос больше к формулировке в контексте истории такого подхода под виндой)
Какое-то время назад было же очень модно (а где-то "необходимо") использовать всякие Nt*/Ke*/Rtl*, которых не было в документации. Ладно в юзермоде, код просто ломался, но на такие драйвера приходилась львиная доля BSOD. Казалось бы - без особых костылей, но логика железная - нет в документации, значит можно менять/удалять по внутренней необходимости винды. Они ж только для внутреннего использования, правда ведь? :)
iago
30.03.2022 19:45Тоже первое что бросилось в глаза. Это так в стиле WinAPI - метод, в который нужно передать 27 параметров, из которых треть недокументирована, треть legacy со времен Win 3.11, треть нужно всегда передавать null. 14 лет не писал под WinAPI, но аж вздрогнул от статьи. Ничего не изменилось в этом кривом дырявом ядре, и уж лучше бы никогда и не менялось чем так как они делают.
aomakarov
31.03.2022 11:38Скажите, а MDI Интерфейс с правильной прорисовкой MDIChildWindow допилили или так и осталось?
pfzim
Уродские интерфейсы без четких границ окон и элементов. Иногда вообще не понятно где закачивается одно окно и начинается другое.
Если не вглядываться и не работать за этим интерфейсом, то со стороны выглядит красиво.
nbvf2011
Вы не правы. У окон есть чёткие границы, включаются в настройках темы. Если этого недостаточно, по умолчанию работают тени для окон. Вот с границами элементов - да, их бывает не видно. Но для исправления этого "недостатка" без проблем можно включить контрастную тему оформления.
klounader
«Вы не правы» и «Идите меняйте тему». Проблема на лицо.
Я согласен с оппонентом выше, эти дизайнеры с дизайнами ради дизайна в жопу без валезина лезут, лишь бы что-нибудь задизайнить. Однако недавно был обзор на 11ю венду, что в ней сочетаются все дизайны всех виндов в разных окнах. Этакая петрушка. Вместо того, чтобы привести к единому стилю устаревшие окна, они продолжают изобретать новое.
Ах да, эти все дизайнеры забывают главное — не все пользуются распоследними мониторами с суперкачественной цветопередачей. На многих устройствах все их полутона и полутени, выделения вкладок и прочие элементы красивостей банально не видны на многих матрицах. Вот я посмотрел на первую картинку из поста и это боль из глаз — зачем там кружочки с чёрточками сбоку, а потом пригнулся и увидел что это походу вкладки. Окна той же десятки по умолчанию все сливаются в одно целое, пока не поменяешь тему на что-нибудь более адекватное. А UI такое, что в зависимости от директории окна пляшут туда-сюда со своим горизонтальным скроллом. Не туда они работают. Не туда. Всё всрато и бесит. На Windows XP было как-то всё намного строже и гармоничнее. И работало в 10 раз быстрее. А теперь бегай ищи куда всё в сотый раз перепрятали.
Eugeeny
ок