С выходом новой операционной системы, у Microsoft изменились приоритеты в дизайне - теперь у интерфейса появились анимации, да и в целом он стал менее острым. В данной статье я поделюсь некоторыми фишками, с которыми столкнулся в процессе работы с WinAPI.

Все параметры в этой статье появились с выходом сборки 22000. И используются с помощью DWM, вызывая функцию DwmSetWindowAttribute.

Оформление Mica

Пример дизайна Mica с сайта Microsft
Пример дизайна Mica с сайта Microsft

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));
Эффект Mica на окне WPF
Эффект Mica на окне WPF

К сожалению, 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.

WPF приложение с дизайном Mica
WPF приложение с дизайном Mica

Изменение цвета окна

Продолжаем список изменений в 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)


  1. pfzim
    29.03.2022 21:59
    +21

    Уродские интерфейсы без четких границ окон и элементов. Иногда вообще не понятно где закачивается одно окно и начинается другое.

    Если не вглядываться и не работать за этим интерфейсом, то со стороны выглядит красиво.


    1. nbvf2011
      30.03.2022 01:30
      +1

      Вы не правы. У окон есть чёткие границы, включаются в настройках темы. Если этого недостаточно, по умолчанию работают тени для окон. Вот с границами элементов - да, их бывает не видно. Но для исправления этого "недостатка" без проблем можно включить контрастную тему оформления.


      1. klounader
        30.03.2022 19:32
        +7

        «Вы не правы» и «Идите меняйте тему». Проблема на лицо.
        Я согласен с оппонентом выше, эти дизайнеры с дизайнами ради дизайна в жопу без валезина лезут, лишь бы что-нибудь задизайнить. Однако недавно был обзор на 11ю венду, что в ней сочетаются все дизайны всех виндов в разных окнах. Этакая петрушка. Вместо того, чтобы привести к единому стилю устаревшие окна, они продолжают изобретать новое.
        Ах да, эти все дизайнеры забывают главное — не все пользуются распоследними мониторами с суперкачественной цветопередачей. На многих устройствах все их полутона и полутени, выделения вкладок и прочие элементы красивостей банально не видны на многих матрицах. Вот я посмотрел на первую картинку из поста и это боль из глаз — зачем там кружочки с чёрточками сбоку, а потом пригнулся и увидел что это походу вкладки. Окна той же десятки по умолчанию все сливаются в одно целое, пока не поменяешь тему на что-нибудь более адекватное. А UI такое, что в зависимости от директории окна пляшут туда-сюда со своим горизонтальным скроллом. Не туда они работают. Не туда. Всё всрато и бесит. На Windows XP было как-то всё намного строже и гармоничнее. И работало в 10 раз быстрее. А теперь бегай ищи куда всё в сотый раз перепрятали.


    1. Eugeeny
      30.03.2022 18:05

      ок


  1. sidorovmax
    29.03.2022 23:18

    Забавно, что системная регулировка толщины границы окна была в Windows 3.1, но была отменена в Windows 95 и далее. А тут, значит, настройку вернули.


    1. Huskers Автор
      30.03.2022 01:20
      +1

      На самом деле, своеобразную регулировку толщины можно было реализовать и в Windows 7, благодаря Aero (кстати, тоже с Dwm). А вот в XP и ниже, как я знаю, всё украшение окна рисуется картинкой


    1. napa3um
      30.03.2022 21:36

      Вроде не отменяли, всегда настраивалась толщина рамки на любых оформлениях (и в классических, и во всех навесных начиная с XP, в 10 не смотрел).


  1. hardtop
    29.03.2022 23:53

    А почему такая странная разрядка: иконка приложения имеет почти одинаковый отступ сверху и слева, а вот "крестик" закрытия окна гораздо сильнее отстоит от правого края.


    1. Vest
      30.03.2022 00:01
      +1

      Думаю, что «они-художники так видят». Я в своё время одного дизайнера спросил про некрасивые отступы, и получил похожий ответ.


      1. hardtop
        31.03.2022 00:00

        Через призму опыта хотел сказать, что это плохой ответ. Художник выражает свой взгляд (со своими акцентами). Художник может гипертрофировать, искать свой стиль.

        Дизайнер - должен решать задачу. И должен уметь объяснить, "зачем" и "почему".


    1. Huskers Автор
      30.03.2022 10:39
      +5

      Чем дольше всматриваешься, тем больше недостатков замечаешь... Тут вот, например, кнопки не ровно стоят

      Эта проблема появляется при масштабировании интерфейса, и тянется ещё с Windows 10


      1. hardtop
        31.03.2022 00:05

        Это, конечно, грустно. Почему в эпоху, когда у телефонов разрешение экрана больше, чем у ноутбука, майки не могут перерисовать интерфейс. Ну, или хотя бы начать...


      1. firehacker
        31.03.2022 11:39

        Я ещё со времён висты/семёрки кричал, что все выравнивания элементов везде, где только можно, похерены.

        Но все молча проглотили. Хорошая же ОС, аэро-фигаэро, чо там!


      1. BkmzSpb
        01.04.2022 11:27

        Я сначала не поверил. Открыл Explorer, и вы оказались правы. Спрведливости ради, это похоже на артефакт каких-то WinApi приложений. Например, такие же проблемы имеют многие "классические" приложения, но не "современные". Все равно бред, особенно после выпуска brand new версии Windows.


        1. Huskers Автор
          01.04.2022 16:40

          Да, вы правы, все приложения, которые используют "кастомные" кнопки, не имеют этой проблемы. К ним относятся UWP, Electron, IDE JetBrains, и т.д.


    1. nidalee
      30.03.2022 18:02

      «крестик» закрытия окна гораздо сильнее отстоит от правого края.
      Есть подозрение, что он там еще и некликабельный. Это чтобы можно было схватить окно за угол, а не заголовок, и изменить его размеры Snap-ом.
      У меня в браузере, когда открыта куча вкладок, схватиться реально больше не за что.
      А вот насчет кривости и косости иконок не знаю что сказать.


      1. hardtop
        31.03.2022 00:08

        Много табов - тут сам пользователь решает. Я просто открываю 3-7 браузеров по темам (и в каждом по 4-10 табов). Но почему разметка кривая - не ясно.


  1. Den3M
    30.03.2022 01:21
    +7

    Чем им не угодили темы Windows ? Все же было. :(
    А теперь унификация дизайна с закосом то ли под WEB, толи под Mobile (Android ?). Не контрастные окна сероватого цвета, в которых без напряжения глаз ничего не видно. Зато уголки закруглили.


    1. Huskers Автор
      30.03.2022 01:29

      Большая часть внешнего вида, которая сейчас есть в Windows 11, появилась ещё пару лет назад в отдельной версии Windows для Surface Duo. Видимо, в Microsoft поступило много положительных отзывов о новом дизайне, что они решили полностью изменить внешний вид своей основной системы.

      Поэтому, да, этот дизайн можно считать в каком-то роде мобильным


    1. dartraiden
      30.03.2022 03:36

      Чем им не угодили темы Windows? Все же было. :(
      Темы это такая штука, что лучше бы их не было. Например, для использования сторонних тем пользователи обожают патчить системные файлы (поскольку тема не подписана, а разрешать неподписанные темы — здоровенная дыра в безопасности), что переводит систему из состояния «тестировалась хоть как-то» в состояние «конфигурация не тестировалась производителем никогда». Ну и все прочие прелести сторонних тем в виде «эта тема подходит только для 19H2, ни в коем случае не пытайтесь использовать её в 20H1, иначе получите чёрный экран».


      1. 13werwolf13
        30.03.2022 07:37
        +2

        в нормальных ОС чому-то таких проблем нет..


      1. KivApple
        30.03.2022 10:12
        +3

        Так это вопрос кривой реализации системы тем, если установка темы оформления может скомпрометировать систему и отсутствует обратная совместимость.

        Если бы тема оформления представляла собой набор картинок и конфигураций, а не являлась обычным исполняемым файлом, то таких проблем не было бы.


        1. dartraiden
          30.03.2022 23:31

          Да, но перепиливать оконный менеджер (или кто там отвечает за натягивание темы), возможно, означает, «реализовать отныне и впредь обратную совместимость тем, но сломать что-то более фундаментальное», а на это Microsoft ни за что не пойдёт.


      1. ZimM
        30.03.2022 20:58

        Обьясните, почему неподписанные темы - здоровенная дыра в безопасности? Как набор картинок и параметров для рисования этих картинок может быть дырой в безопасности? Вы вот сейчас на хабре сидите, неподписанный доверенным центром сертификации CSS скачиваете. Опасносте?


        1. dartraiden
          30.03.2022 23:28

          Тема это не просто набор картинок, а исполняемый файл, в ресурсах которого содержатся уже сами картинки. Когда ты Microsoft, то любая проблема кажется решаемой с помощью формата PE.

          А ещё темы допускают подгрузку удалённых ресурсов, где нас поджидают сюрпризы.

          Поэтому, лучше бы не было никакой реализации тем, чем такая, где юзеры радостно патчат системные файлы, чтобы воткнуть недоверенные темы от неизвестного Васяна с deviantart.


          1. 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-архива?


      1. redsh0927
        01.04.2022 07:40

        Запрет на запуск неподписанного чего-либо — это смерть свободы и превращение компьютера в быдлодевайс


  1. Rouse
    30.03.2022 07:26
    +1

    За информацию об DWMWA_WINDOW_CORNER_PREFERENCE прямо неистово плюсую :)


  1. FluD
    30.03.2022 07:44
    +11

    я всё не перестану задавать один и тот же вопрос, зачем они запретили классическую тему, под капотом она всё еще там и нет причин её запрещать.

    чтоб посмотреть на классическую тему достаточно в winlogon удалить все handle с названием Theme* и перезапустить explorer


    1. El_Kraken_Feliz
      30.03.2022 08:45
      +6

      Потому что тогда Вы не сможете получить "нью юзер экспириэнс"

      Зачем Вам этот экспириэнс нужен, я не имею ни малейшего понятия, но все делают так - значит надо


      1. sundmoon
        30.03.2022 13:06
        +1

        Потому что получается вендорлок. Правильно, Вам он не нужен.

        Большинство нетехнических юзеров страдает от "нью юзер экспириенса" молча, большинство типа-виндузятников ищут способы оставаться на "десятке", "семёрке" а то и на XP, хотя бы визуально.

        Мне лично пофиг - но к сожалению потому, что я отношусь к редчайшему психотипу "дискретов" (vs. визуалы-аудиалы-кинестетики). Стили окошек, "темы" и прочий "фронтенд" волнуют меня меньше всего. Хотя... и меня можно вывести из себя явно непрофессиональным вредительством, вроде тёмных окон без рамки на тёмном же фоне.


    1. Warhammer_iii
      30.03.2022 23:42

      А можете чуть подробнее раскрыть пожалуйста? Нужно переходить, но новые интерфейсы это лютая боль.


    1. zartarn
      31.03.2022 10:25

      Проблема что классическая тема не использует GPU + в драйверах подзабивают на реализацию 2D GDI что приводит к графическим багам и т.д. Вот тут длинная эпопея по этой теме https://jeyndoe.github.io/edump/pages/action=vthread&forum=12&topic=25612&page=0.html


  1. Torvald3d
    30.03.2022 12:53

    Изменение цвета окна

    А можно как-то изменить цвет у всех окон приложения? То есть чтобы не приходилось при создании очередного окна вызывать этот код, а применить его глобально один раз, по умолчанию, чтобы все существующие и новые окна были с измененным заголовком?


    1. Huskers Автор
      30.03.2022 14:36
      +2

      Насколько я знаю, функции Dwm применяются только к конкретному окну.

      Но! Можно засунуть этот код в обработку сообщения WM_CREATE в WinProc, и тогда все созданные окна одного класса будут иметь нужный стиль.


      1. Torvald3d
        30.03.2022 14:44

        И правда, спасибо)


  1. kb31
    30.03.2022 15:29
    +3

    Mica можно включить в WinApi приложениях без особых костылей.

    Сделать это можно, используя переменную, которая официально не задокументирована.

    Как же вы недооцениваете чудовищность этого костыля


    1. Huskers Автор
      30.03.2022 15:43

      Учитывая то, что эта переменная не задокументирована, она не вошла в обиход. Большинство из тех людей, кто пользовался Mica помимо тестов, скорее всего знают про её изменения в будущих сборках.

      (Так, единственная мне известная реализация Mica в WPF уже использует два варианта включения)


      1. kb31
        30.03.2022 17:30

        Да, следующий абзац я прочитал. Вопрос больше к формулировке в контексте истории такого подхода под виндой)

        Какое-то время назад было же очень модно (а где-то "необходимо") использовать всякие Nt*/Ke*/Rtl*, которых не было в документации. Ладно в юзермоде, код просто ломался, но на такие драйвера приходилась львиная доля BSOD. Казалось бы - без особых костылей, но логика железная - нет в документации, значит можно менять/удалять по внутренней необходимости винды. Они ж только для внутреннего использования, правда ведь? :)


        1. Huskers Автор
          30.03.2022 18:51

          Ну да, действительно, не очень хорошая практика


    1. iago
      30.03.2022 19:45

      Тоже первое что бросилось в глаза. Это так в стиле WinAPI - метод, в который нужно передать 27 параметров, из которых треть недокументирована, треть legacy со времен Win 3.11, треть нужно всегда передавать null. 14 лет не писал под WinAPI, но аж вздрогнул от статьи. Ничего не изменилось в этом кривом дырявом ядре, и уж лучше бы никогда и не менялось чем так как они делают.


  1. aomakarov
    31.03.2022 11:38

    Скажите, а MDI Интерфейс с правильной прорисовкой MDIChildWindow допилили или так и осталось?