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

Описание:

Я использую списки изображений, загруженные в формате PNG, чтобы обеспечить прозрачность в моем меню и кнопках скорости. Также используются темы времени выполнения, чтобы пользователь мог определить интерфейс GUI.

Если стиль не выбран, он же стиль «Windows», для моей панели инструментов генерируются красивые маски, и все работает как положено. Однако, когда я активирую стиль (независимо от того, какой), выполняется очень странная визуализация масок, где некоторые кнопки кажутся пустыми (первая и предыдущая кнопки) при отключении, а некоторые (кнопки публикации и отмены) действительно показывают минимальная маска исходного изображения.

Исследования. Я создал приложение для тестирования стиля VCL и заглядываю в VCL, чтобы узнать, как именно происходит процесс рисования. Мое исследование SO здесь связано с этой более или менее связанной темой, но id вмятина действительно помочь обойти мою проблему.

Тем временем я могу представить, что кто-то еще наткнулся на это и может указать мне правильное направление.

Вопрос:

Я ищу способ, чтобы эти маски отображались правильно или автоматически генерировались (например, эта ссылка), что позволяет работать так, как ожидалось, даже при использовании стилей VCL. Это можно сделать, создав маски автоматически в моих списках изображений или, что предпочтительнее, изменив поведение, которое создает маски для пользовательского рисования стилей.

Стандартный стиль показывает панель инструментов нормально: Стандартный стиль показывает панель инструментов нормально

Использование пользовательского стиля, без изображений на кнопках: с использованием пользовательского стиля, без изображений на кнопках

Другой пользовательский стиль, и вы даже пропустите кнопки Еще один пользовательский стиль, и вы даже пропустите кнопки

Кстати: «Не использовать стили» не будет ответом, который я ищу.


person H.Hasenack    schedule 15.06.2018    source источник
comment
Привет! Я думаю, что вам не следует использовать стили)) Но с серьезной точки зрения вы должны либо заглянуть в исходный код VCL.Style (или как называется модуль со стилем кода?), либо купить коммерческое решение, чтобы иметь скин в вашей программе. Кстати, вы уже сообщили QC Embarcadero о своей проблеме? P.S. Вы также пытались расширить стили этим парнем? Возможно, это могло бы помочь вам.   -  person Josef Švejk    schedule 15.06.2018
comment
Можете ли вы предоставить изображения png? В случае, если это все стандартные стили, можете ли вы дать названия, чтобы мы могли попробовать?   -  person Uwe Raabe    schedule 15.06.2018
comment
Кстати, для каждого стиля нередко используются разные значки.   -  person Uwe Raabe    schedule 15.06.2018
comment
Я не хотел создавать целый набор изображений отключенных кнопок на основе изображений, которые там есть. Да, я ленивый. Но я придумал кое-что, что работает для меня, и мне нравится делиться этим.   -  person H.Hasenack    schedule 15.06.2018


Ответы (1)


Как оказалось, есть недокументированное свойство Vcl.Controls.TImageList.GrayscaleFactor

Если там есть что-то кроме 0, изображения правильно отображаются в сером цвете при использовании стилей.

Сам фактор оттенков серого, по-видимому, влияет на «темноту» получающихся отключенных кнопок. Значение по умолчанию равно 0, что приводит к поведению, указанному выше. Grayscalefactor, по-видимому, не действует, если не активна тема среды выполнения.

Лично мне было бы лучше, если бы GrayscaleFactor также влиял на прозрачность, поэтому кнопки выглядели бы более «фантомными», а не «серыми». Серый может работать не во всех темах... представьте себе "серую" тему :)

Ниже показано влияние TImageList.Grayscalefactor на синюю тему Windows 10.

GrayScaleFactor=1 GrayScaleFactor=1

GrayScaleFactor=128 GrayScaleFactor=128

GrayScaleFactor=255 (максимально допустимое значение) GrayScaleFactor=255 (максимально допустимое значение)

person H.Hasenack    schedule 15.06.2018
comment
Вы можете попробовать использовать TPngImageList (содержится в PngComponents: bitbucket.org/uweraabe/pngcomponents), который обычно работает лучше в отношении прозрачности и альфа-смешивания. Вы также можете выбрать между смешиванием и оттенками серого (или обоими) для отключения. - person Uwe Raabe; 15.06.2018
comment
Хороший совет, я посмотрю на это на следующей неделе. - person H.Hasenack; 15.06.2018