【问题标题】:Transparent PNG image (with TImageList) in a TMainMenuTMainMenu 中的透明 PNG 图像(带有 TImageList)
【发布时间】:2011-10-26 09:54:51
【问题描述】:

我想在 TImageList 中加载具有透明背景的 PNG,并在 TMainMenu 中使用它(通过 TAction)。
然而,在 Delphi 中,背景只是黑色。在 Delphi 中只支持 PNG 的一半吗?

This 的家伙说这对他有用,但用一个按钮而不是主菜单。

我的设置:

  • 我的图像是每种颜色 8 位加上 8 位用于透明度通道(我也尝试使用 1 位用于透明度,但仍然不起作用)。该图像在任何其他程序中看起来都很好。
  • 德尔福 XE。
  • 在 TImageList 的编辑器中,“透明颜色”和“填充颜色”设置为“默认”并被禁用。

【问题讨论】:

  • 嗨,RRuz。我使用 TImageList。它有一个 DrawingStyle 属性,它只能设置为“透明”(这仍然不起作用)。但是没有cd32bit。
  • 对不起,我的意思是属性ColorDepth必须设置为cd32Bit
  • 更改颜色深度时必须重新加载图像。这与更改宽度或高度相同。我对 Windows 7 上的这个设置没有任何问题,即使 DrawingStyle 设置为正常。
  • @Altar 当您更改 TimageList 组件的某些属性(例如:宽度、高度或颜色深度)时,图像将从组件中删除,这就是 TImagelist 的工作方式。 Ayway回到你原来的问题,你必须将TimageList的ColorDepth属性设置为cd32Bit,然后加载must be in 32 bpp png format.的图像
  • “很多工作会丢失”...您确定使用的是源版本控制系统吗?

标签: delphi delphi-xe


【解决方案1】:

我从 Delphi 7 开始就一直在使用TPngComponents。它为大多数 delphi 内置/第三方组件提供了非常好的 png 支持。 Embarcadero 购买了另一个众所周知的开源 PNG 支持组件,称为 TPngImage,并在以后的 Delphi 版本中内置到 Delphi 的本机图形支持中。所以当我换到Delphi 2010时,我认为Delphi现在已经有原生支持了,并测试了原生支持,但发现alpha支持不够好。

所以我再次使用了 TPngComponents,它对大多数组件都有更好的支持,包括 主菜单。我认为这个包应该可以在 DXE 中使用,只需要进行有限的修改。

编辑:感谢 Uwe Raabe 指出 Codegear(现为 Embarcadero)购买的产品是另一个组件 TPngImage 而不是 TPngComponent。

【讨论】:

  • 好的。谢谢。所以这是一个德尔福错误。我将回到良好的旧 BMP 格式。 Delphi 和我们可以用它创建的“现代”GUI 界面万岁。
  • PngComponents 未被 CodeGear(现为 Embarcadero)收购。那只是 Gustavo Daud 对 PNG 的支持。 PngComponents 是并且一直是基于 Martijn Saly 创建的 PNG 支持的组件包。当前版本适用于 D2009 及更高版本。
  • @Uwe Rabbee 哦,我检查了,是的,我将 TPngImage 与 TPngComponent 混合在一起。 Codegear(现为 Embarcadero)的详细信息可以在Nick Hodges Blog 中找到。不管为什么 Delphi 本机支持与我使用的 TPNGComponent 不同。感谢您指出这一点,我将修改我的消息。
【解决方案2】:
  1. 为 TImageList 设置以下属性值:
  • 绘图样式:dsTransparent
  • 颜色深度:cd32Bit
  1. 在“应用程序”下的“项目设置”中设置“启用运行时主题”。

德尔福 Rio 更新:

TImageList 必须有:

  • BkGColor = clNone
  • BlendColor = clNone,
  • ColorDepth = cd32bit,
  • DrawingStyle = dsTransparent(或)dsNormal,
  • 蒙面 = 真。

可以从具有 透明 bkg 颜色的 PNG 加载图像。


注意:编辑 TImageList 的某些属性将删除(没有任何通知)列表中的所有现有图像。首先备份您的图像。

【讨论】:

  • 根据您的链接,Delphi XE 几乎(见下文)准备好使用 alpha 通道 PNG。但是你必须知道如何使用 TImageList 编辑器。我们使用的方式是将所有图像备份在目录中并编号,例如000_image1.png、001_image2.png 等等。然后在每次更改时,我们只需清除图像列表并重新加载该目录中的图像,这可以通过一个 Add... 命令完成,并且图像按照以前的顺序排列。然而,有一个(今天微不足道的)问题:没有启用运行时主题,PNG 透明度在 Delphi XE 中不起作用。
【解决方案3】:

没有理由备份整个 DFM 文件。

在对您的ImageList 进行操作之前,您应该导出图像:单击图像列表编辑器中的“导出”按钮,它将所有图像保存到单个.BMP 文件中。

更改属性后:ColorDepth = cd32Bit, DrawingStyle = dsTransparent

您应该点击“添加”按钮并选择您之前导出的文件。然后,将在菜单和工具栏中以透明方式绘制图像(至少在 D2010 上)...无需使用 3rd 方组件。

【讨论】:

  • 如果您的“导出”按钮一次导出所有图像,那么如何导出单个图像? (在我的例子中,“导出”按钮只导出一张图片。
  • 这个按钮可以做两件事。 1)如果您在“图像”列表中没有选择任何内容,它将导出图像列表中的所有图像。 2)如果选择了一个或多个图标,它将只导出选定的图像。
  • 如何在“图片”列表中“不选择任何内容”?当我双击TImageList 组件时,最初总是选择第一个图像,然后单击 Export 按钮将坚持只导出那个图像。如何导出整个图像列表?
  • @IanBoyd - 点击图标列表的最底部,滚动条的正上方。
猜你喜欢
  • 1970-01-01
  • 2019-03-18
  • 2015-11-12
  • 2011-10-19
  • 2011-05-31
  • 2016-09-29
  • 2016-10-06
  • 2018-10-09
  • 2015-07-10
相关资源
最近更新 更多