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

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

Оформление Mica

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

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

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

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

Продолжаем список изменений в 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 для личного использования. Ведь если развернуть окно на половину или четверть экрана, то его углы так же станут квадратными.

Заключение

Это не все нововведения в кастомизации внешнего вида окон. "За кадром" остались параметры для изменения толщины границы, и отзеркаливания всего окна. Но это очень специфические возможности, о которых я решил не рассказывать.

Надеюсь, для кого-то эта статья окажется полезной.