一个可以正确处理PNG透明度的按钮控件及替代TBitmap的代码实现,无需编写预混合代码。

16
Delphi 2010的TSpeedButtons似乎无法正确支持PNG透明度,因为Glyph属性在内部使用TBitmap,而TBitmap仅适用于位图,不能正确支持PNG透明度,因此TSpeedButton.Glyph也无法支持透明度。更新:实际问题是我有一些外部组件(Developer Express组件)导致delphi的PNG支持无法正常工作,另一方面,虽然TImage仍然是TPicture,但可以支持PNG,但也受到这个Developer express bug的影响。
已经有一个关于此问题的问题here,答案显示如何使用预混合,以便透明度不会变成黑色像素。我想知道是否有另一个按钮控件,在设计时使用alpha-blended PNG,并且不会将PNG资源转换为BMP格式,丢弃alpha通道并导致此处显示的黑色边框。
简而言之,该控件将不使用TBitmap,并且不使用TBitmap的所有颜色键透明功能。
重申一下,我不是在询问如何解决黑色周围问题,同时仍然使用过时的TBitmap/TSpeedButton基于VCL的功能,因为它缺乏现代PNG透明度功能,我正在寻求用其他东西替换它,以使其“只能工作”。
作为次要缺点,将小的.png文件转换为.DFM位图资源实际上是浪费空间,并使我的表单.DFM内容太大。原生.png文件格式存储在.dfm中应该使生成的表单更小。

enter image description here

更新:PngComponents看起来应该可以工作,但是当我尝试将png加载到Png速度按钮中时,出现了无效的图形格式错误。请注意,Png图像列表组件没有这样的问题。似乎cxLibrary(一个Developer Express包)正在破坏事情。一旦我删除了所有Developer Express的东西,这个问题就消失了。所以虽然我选择了Pngcomponents作为答案,但如果你安装了devex的东西,请使用他们的按钮,而不是Pngcomponents。

enter image description here


2
如果您不想将图像放入dfm中,则不要这样做,将它们作为资源加载。在我看来,这是唯一明智的方法。如果您将资产放入dfm文件中,则失去了将资产保留在版本控制中的能力。 - David Heffernan
1
为什么不将你的PNG文件放入.ico文件中,并在运行时将它们加载到图像列表中呢? - David Heffernan
P.S. 希望你的新工作进展顺利! - David Heffernan
TToolBar按钮与图像列表一起使用也应该可以工作。 - Ondrej Kelle
3个回答

12
您可以查看PngComponents。 它具有TPngSpeedbutton和其他一些直接使用PngImages的控件。

谢谢。看起来不错!我想我以前听说过他们,但从未了解过。 - Warren P
1
我在使用PngComponents时,在设计时无法加载.PNG文件,经过追踪发现是由于一个旧的RXLIB设计时包导致的。我将其删除后,现在出现了“无效的图形格式异常:[2108C8A0]{designide150.bpl} PicEdit.TGraphicProperty.Edit (Line 272, "PicEdit.pas" + 10) + $12”错误提示。 - Warren P
已确认,Developer Express cxLibraryD15破坏了PngComponents。从我的IDE中删除了Devex的内容(我们不再使用它),问题解决了。但由于很多人仍在使用它,我在问题上面留下了注释。如果您使用Developer Express组件,则最简单的解决方案似乎是使用他们自己的cxButton。 - Warren P
PngComponents 在 PngFunctions.pas 的初始化部分注册了旧的 TPngObject 类。这将允许加载使用旧的 PngImage 实现制作的旧表单。其他库可能正在执行类似的操作,这可能是崩溃的原因。由于我目前手头没有 DevExpress 组件,所以无法自行解决这个问题。 - Uwe Raabe
我没有安装DevExpress,但仍然遇到了这个错误。我只安装了CnWizards和GExperts。我成功摆脱这个错误的唯一方法是在PngFunctions.pas中显式地将其与“PNG”扩展名关联起来,像这样:“TPicture.RegisterFileFormat('PNG', 'PNG File', TPNGObject);”。 - Nedko

2
你还可以查看名为TAdvGlowButton的TMS软件组件,因为它支持带有alpha透明度的PNG图像。 网站链接...

我已经使用过这个按钮,感觉非常不错!总的来说,TMS的东西也相当不错。 - Warren P

2
原来,在Developer Express VCL组件包中提供的cxButton也支持PNG按钮。

同时,事实证明PngComponents中的Developer Express工具是互斥的。请选择其中一个。 - Warren P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接