如何使用Alpha通道将图像绘制到TSpeedButton?

Mas*_*ler 6 delphi vcl alphablending delphi-xe4

我有一个TSpeedButton,并且有一个TImageList包含各种字形.其中一个有一个alpha通道,当它被绘制到UI的某些部分时看起来非常好......但是当在a上绘制该字形时TSpeedButton,它不会使alpha通道生效.

查看相关代码TButtonGlyph.DrawButtonGlyph,它将被传递trueTransparent参数,但Transparentif FThemesEnabled代码路径中根本没有考虑; 它只在else部分引用.由于此程序启用了主题,这是否意味着无法将alpha混合图像绘制为TSpeedButton

有什么方法可以解决这个问题吗?

编辑:更仔细地看一下,它似乎需要考虑透明度......有点儿.完全透明的像素根本不会被绘制,这是正确的行为.但是边缘周围的抗锯齿(部分透明)被绘制为完全不透明.

Dav*_*nan 6

从我所看到的,TSpeedButton获取您的位图并将其添加到图像列表.这是FGlyphList在私人部分TButtonGlyph.该图像列表具有ColorDepthcdDeviceDependent.如果您希望尊重Alpha透明度ColorDepth,cd32Bit则需要该图像列表.所以就在那里解释了这些文物.

我不确定你是如何解决这个问题的.我认为我个人TButtonGlyph将其子类化并直接连接到您选择的图像列表.然后TButtonGlyph.DrawButtonGlyph使用从图像列表中绘制的代码替换.我相信你能够编制代码.

但是没有简单的解决方法.如果cdDeviceDependent不对VCL进行重大修改,那么该图像列表将会被使用,并且没有简单的方法可以改变它.我看不到明显的快速解决方案.

实际上,我会做的就是使用TButton,但那只是我.


关于Transparent速度按钮的属性,文档说:

指定按钮的背景是否透明.

使用"透明"指定按钮的背景是否透明.

仅当TSpeedButton的Flat属性设置为True时,此属性才有效.

启用Windows主题时,"透明"属性无法使按钮背景透明.

也就是说,该属性会影响按钮背景,对于平面按钮,未经训练时,与绘制字形无关.