Вопрос, поднятый в данной теме, связан с некорректным отображением разделителей (сепараторов) в тулбаре Delphi, когда активны темы Windows. Разделители в тулбаре могут быть полезны для логического разделения групп иконок, однако стандартное отображение сепараторов в тематизированных тулбарах может быть не совсем тем, что требуется разработчику. В частности, возникает проблема с двойными вертикальными линиями, где одна линия находится по центру кнопки-разделителя, а вторая - у левого края.
Описание проблемы
Разработчики столкнулись с тем, что при использовании стиля tbsDivider для кнопок-разделителей в тулбаре TToolbar возникает проблема с двойными вертикальными линиями. Это нежелательное поведение, так как разработчики хотят видеть разделитель с одной центральной линией. В старых версиях приложения, где темы Windows были отключены, разделители отображались корректно — с центральной линией. Однако при активации тем Windows проблема возникает снова.
Контекст и решение проблемы
Исходя из предоставленного контекста, проблема заключается в некорректной работе с темами Windows и в том, как VCL обрабатывает стили тулбарных кнопок. В частности, стиль tbsDivider в VCL реализован с использованием кастомной функции покраски, которая в новых версиях comctl32 приводит к появлению двух вертикальных линий вместо одной.
Подтвержденный ответ
Для решения проблемы можно использовать следующие шаги:
Отключить стиль Flat для TToolBar, чтобы убрать одну из линий. Однако, TToolBar.CreateParams автоматически включает стиль Flat, когда StyleServices включен. Поэтому необходимо использовать API для отключения этого стиля:
procedure TForm1.FormCreate(Sender: TObject);
var
TbStyle: DWORD;
begin
if StyleServices.Enabled then begin
TbStyle := SendMessage(ToolBar1.Handle, TB_GETSTYLE, 0, 0);
SendMessage(ToolBar1.Handle, TB_SETSTYLE, 0, TbStyle and not TBSTYLE_FLAT);
end;
end;
После отключения стиля Flat, проблема с двойными линиями решается, но остается проблема с тем, что разделитель не находится точно по центру. Это связано с тем, что VCL использует тематический API для покраски сепаратора, который рисует линию слева от сепаратора. Чтобы решить это, VCL передает тематическому API правую половину прямоугольника сепаратора, что приводит к тому, что линия оказывается примерно по центру.
Альтернативный ответ
В качестве альтернативного решения можно использовать ActionToolBars, которые позволяют достичь желаемого результата даже в современных версиях Delphi и Windows с активными темами. Для этого:
Создайте менеджер действий (Action Manager).
Добавьте необходимые действия.
Создайте ImageList для иконок действий.
Свяжите каждое действие с изображением.
Добавьте на форму ActionToolBar.
Перетащите действия на тулбар и настройте их свойства.
Используйте "Drag to create Separators" для добавления разделителей.
Этот подход позволяет создать красивый тулбар с разделителями между иконками.
Заключение
Использование ActionToolBars может быть более предпочтительным решением, так как оно позволяет избежать проблем, связанных с темами Windows и некорректным отображением сепараторов в стандартном TToolBar. Это решение также более гибкое и позволяет использовать дополнительные возможности для кастомизации тулбара.
Проблема связана с неправильным отображением разделителей в тулбаре Delphi из-за использования активных тем Windows, что приводит к появлению двойных вертикальных линий вместо одной.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.