Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

### Исправление Визуального Отображения Разделителей в Тулбаре Delphi с Активными Темами Windows

Delphi , Синтаксис , Справочник по API-функциям

Исправление Визуального Отображения Разделителей в Тулбаре Delphi с Активными Темами Windows

Вопрос, поднятый в данной теме, связан с некорректным отображением разделителей (сепараторов) в тулбаре Delphi, когда активны темы Windows. Разделители в тулбаре могут быть полезны для логического разделения групп иконок, однако стандартное отображение сепараторов в тематизированных тулбарах может быть не совсем тем, что требуется разработчику. В частности, возникает проблема с двойными вертикальными линиями, где одна линия находится по центру кнопки-разделителя, а вторая - у левого края.

Описание проблемы

Разработчики столкнулись с тем, что при использовании стиля tbsDivider для кнопок-разделителей в тулбаре TToolbar возникает проблема с двойными вертикальными линиями. Это нежелательное поведение, так как разработчики хотят видеть разделитель с одной центральной линией. В старых версиях приложения, где темы Windows были отключены, разделители отображались корректно — с центральной линией. Однако при активации тем Windows проблема возникает снова.

Контекст и решение проблемы

Исходя из предоставленного контекста, проблема заключается в некорректной работе с темами Windows и в том, как VCL обрабатывает стили тулбарных кнопок. В частности, стиль tbsDivider в VCL реализован с использованием кастомной функции покраски, которая в новых версиях comctl32 приводит к появлению двух вертикальных линий вместо одной.

Подтвержденный ответ

Для решения проблемы можно использовать следующие шаги:

  1. Отключить стиль 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;
  1. После отключения стиля Flat, проблема с двойными линиями решается, но остается проблема с тем, что разделитель не находится точно по центру. Это связано с тем, что VCL использует тематический API для покраски сепаратора, который рисует линию слева от сепаратора. Чтобы решить это, VCL передает тематическому API правую половину прямоугольника сепаратора, что приводит к тому, что линия оказывается примерно по центру.

Альтернативный ответ

В качестве альтернативного решения можно использовать ActionToolBars, которые позволяют достичь желаемого результата даже в современных версиях Delphi и Windows с активными темами. Для этого:

  1. Создайте менеджер действий (Action Manager).
  2. Добавьте необходимые действия.
  3. Создайте ImageList для иконок действий.
  4. Свяжите каждое действие с изображением.
  5. Добавьте на форму ActionToolBar.
  6. Перетащите действия на тулбар и настройте их свойства.
  7. Используйте "Drag to create Separators" для добавления разделителей.

Этот подход позволяет создать красивый тулбар с разделителями между иконками.

Заключение

Использование ActionToolBars может быть более предпочтительным решением, так как оно позволяет избежать проблем, связанных с темами Windows и некорректным отображением сепараторов в стандартном TToolBar. Это решение также более гибкое и позволяет использовать дополнительные возможности для кастомизации тулбара.

Создано по материалам из источника по ссылке.

Проблема связана с неправильным отображением разделителей в тулбаре Delphi из-за использования активных тем Windows, что приводит к появлению двойных вертикальных линий вместо одной.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Справочник по API-функциям ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2024-12-26 14:12:58/0.0035099983215332/0