Delphi 使用样式时,工具栏上图像列表的位图会以意外的方式被遮罩

Delphi 使用样式时,工具栏上图像列表的位图会以意外的方式被遮罩,delphi,transparency,vcl,timagelist,Delphi,Transparency,Vcl,Timagelist,说明: 我使用PNG加载的图像列表来允许菜单和速度按钮的透明度。 还使用运行时主题允许用户定义GUI体验 如果未选择任何样式,即Windows样式,将为我的工具栏生成漂亮的遮罩,并且一切正常。然而,当我激活一个样式时,不管是哪一个样式,都会执行一个非常奇怪的蒙版渲染,其中一些按钮在禁用时显示为空的第一个和前一个按钮,而一些post和cancel按钮实际上会显示原始图像的最小蒙版 研究: 我已经创建了一个VCL风格的测试应用程序,我正在窥探VCL以了解绘图过程是如何进行的。 我在这方面的研究是有结

说明:

我使用PNG加载的图像列表来允许菜单和速度按钮的透明度。 还使用运行时主题允许用户定义GUI体验

如果未选择任何样式,即Windows样式,将为我的工具栏生成漂亮的遮罩,并且一切正常。然而,当我激活一个样式时,不管是哪一个样式,都会执行一个非常奇怪的蒙版渲染,其中一些按钮在禁用时显示为空的第一个和前一个按钮,而一些post和cancel按钮实际上会显示原始图像的最小蒙版

研究: 我已经创建了一个VCL风格的测试应用程序,我正在窥探VCL以了解绘图过程是如何进行的。 我在这方面的研究是有结果的,但我真的没办法解决我的问题

同时,我可以想象其他人也卷入了这件事,可以给我指出正确的方向

问题是:

我正在寻找一种方法,使这些面具显示正确,或自动生成像这样的链接,允许它的工作,即使在使用VCL风格的预期。这可以通过在“我的图像列表”中自动创建遮罩来实现,或者最好通过更改为自定义图形样式生成遮罩的行为来实现

标准样式显示工具栏精细:

使用自定义样式,按钮上无图像:

另一种自定义样式,您甚至会错过按钮


顺便说一句:不要使用样式不是我想要的答案。

事实证明,有一个未记录的属性Vcl.Controls.TImageList.GrayscaleFactor

如果其中不包含0,则在使用样式时,图像将正确地以灰色方式渲染

灰度因子本身似乎对结果禁用按钮的暗度有影响。默认值为0,这将产生上述问题中的行为。如果没有运行时主题处于活动状态,则Grayscalefactor似乎没有任何效果

就我个人而言,如果GrayscaleFactor也会影响透明度,我会更喜欢它,这样按钮看起来会更像鬼影而不是灰色。灰色可能不适用于所有主题。。。想象一个灰色的主题:

下面是TImageList.Grayscalefactor对Windows10蓝色主题的影响

灰度因子=1

灰度因子=128

GrayScaleFactor=255允许的最大值

嗨!我认为您不应该使用样式,但从严肃的角度来看,您必须查看VCL.Style或带有样式代码的单元名称?源代码或购买商业解决方案,使您的程序具有外观。顺便问一下,你有没有告诉Embarcadero的QC你的问题?顺便问一下,你也尝试过通过这个扩展样式吗?也许它可以帮助你。你能提供png图像吗?如果这些都是标准的库存样式,你能给出名称吗,我们可以试试?顺便说一句,每个样式都有不同的图标是很常见的。我不想基于那里的图像创建一整套禁用的按钮图像。是的,我很懒。但是,我想到了一些对我有用的东西,我想和大家分享一下。你可以尝试使用PngComponents:中包含的TPngImageList,它通常在透明度和alpha混合方面表现更好。你们也可以选择混合和灰度,或者两者兼有。好提示,我将在下周研究。