Трюки с формой 2.2.2: Тёмная тема Windows в Delphi XE7

Тёмная тема Windows доступна и в XE 7. Но, так как эта версия Delphi создавалась во времена Windows 7, то ни о каком High-DPI, ни о каких тёмных темах, тогда ещё речи не было. Между тем, всё возможно.

Эта статья — продолжение разговора, начатого в статье: «Трюки с формой 2.2.1: Тёмная тема Windows в Delphi 12». Все основные приёмы описаны там. Здесь описаны нюансы именно для XE 7. Для понимания материала, лучше начать со статьи 2.2.1.

Подготовка

Копируем проект для XE 7 из статьи «Трюки с формой 2.1: Edit в заголовке окна». Из предыдущей статьи «Трюки с формой 2.2.1: Тёмная тема Windows в Delphi 12» забираем два файла: UnMain.pas и IP76.FormTitleInfo.pas, и бросаем поверх существующих. При компиляции будет ругань на System.ImageList. Просто удаляем его из uses.

Для Delphi 12 мы использовали стиль  Windows10 Dark. В XE 7 его нет, поэтому копируем его:

  1. Идём в каталог установки Delphi12  \Program Files (x86)\Embarcadero\Studio\23.0\Redist\styles\vcl\
  2. Копируем Windows10Dark.vsf
  3. Идём в каталог \Users\Public\Documents\Embarcadero\Studio\15.0\Styles
  4. Вставляем туда ранее скопированный Windows10Dark.vsf

Теперь он есть в списке стилей, включаем галочку, оставляем стиль по умолчанию Windows. Об этом говорилось в предыдущей статье.

Делаем ComboBox1.Style := csDropDownList. Проверяем, есть ли реакция на событие OnChange, если нет, в инспекторе выбираем для ComboBox1.OnChange существующий ComboBox1Change.

Для всех компонент, которые должны быть в заголовке, выставим Anchors := [akTop,akRight], чтобы при изменении размера формы они оставались у системных кнопок.

Запускаем. В светлой теме всё прекрасно:

Переключаем в тёмную:

Видим какие-то левые кнопки выпадающих списков и отсутствие системных кнопок. Первое мы вылечим сменой стиля, второе – сменой ловушки на стиль.

Меняем стиль тёмной темы

Стиль, который мы позаимствовали из Delphi 12, отличается от стилей XE 7 как минимум тем, что он поддерживает высокое разрешение, про которое XE 7 ничего не знает. Поэтому, уберём его из используемых стилей и выберем стиль Carbon.

Cтиль по умолчанию должен остаться Windows. Меняем наименование стиля для тёмной темы в обработчике OnChange для ComboBox1:

Стало получше. Системных кнопок нет.

Меняем ловушку стиля

Посмотрев, как реализована ловушка стиля для TCustomForm, обнаружим, что смещение для заголовка GlassForm.Top там не учитывается совершенно. Поэтому немного меняем ловушку. Нас всё устраивает, только хотим чуть-чуть изменить отрисовку фона.

В Delphi 12 всё давным-давно учтено, поэтому этот нюанс касается только до-TitleBarPanel версий.

В обработчике OnCreate формы добавим такую строку:

И наблюдаем явное улучшение:

Есть баг на кнопке ButtonEdit1 – белое поле, но это уже вопросы к стилю. Это частности, решаемые в частном порядке. Например, переходом на более свежие версии.

Максимизация окна

Баги отрисовки

Если несколько раз максимизировать окно и вернуть обратно, то либо сразу, либо через пару раз, появится баг в заголовке:

Немного сместился текст заголовка и «клиентское» поле формы заехало в «заголовок». Если свернуть и развернуть окно, то всё пропадает. Также, если изменить размер, эффект тот же. Но ни эмуляция перечисленного, ни попытка что-либо изменить в ловушке стиля, ничего не помогает.

Лечим таким образом. В обработчике OnPaint формы пишем следующее:

И всё заработало. Заголовок стал цвета стиля.

Вот теперь почти всё хорошо.

Верхнее выравнивание

Конечно, это к тёмной теме отношения мало имеет. Дело в том, что при максимизированном состоянии, наши компоненты в заголовке могут уехать за пределы монитора куда-то вверх.

Придётся выравнивать компоненты руками для разных стилей окна. Для этого переопределим метод Resize и учтём, что в процессе смены цветовой темы ничего менять не надо:

Теперь выравнивание по верхнему краю работает как надо.

Следует отметить, что для Delphi 12 это не актуально. Введя в обиход TitleBarPanel, они перестали менять высоту заголовка для разных стилей окна. Между тем, в аналогичном проекте для Delphi 12, этот метод существует в таком же виде. Как минимум, чтобы выровнять pbTitle по крайнему левому компоненту, ну и просто это правильно, учитывать нюансы.

Листинги

Привожу на этот раз только модуль формы, во вспомогательном классе ничего не изменилось по сравнению с предыдущей статьей.

Модуль формы

TFmMain

[свернуть]

Скачать

Друзья, спасибо за внимание!

Исходник (zip) 138 Кб. Delphi XE 7

Исполняемый файл (zip) 1.07 Мб (Скомпилирован в XE 7)


5 3 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Не нашли ответ на свой вопрос? Задайте его здесь!...x