6

我已经为这个(简单的)花了几个小时但没有找到解决方案:/

我正在使用 D7 和 TImageList。ImageList 被分配给一个工具栏。当我在设计时填充 ImageList 时,图标(部分透明)看起来很好。但是我需要在运行时填充它,当我这样做时,图标看起来很糟糕——完全失去了部分透明度。

我只是尝试从 .res 文件加载图标 - 结果相同。我尝试过第三方图像列表也没有成功。我不知道我能做什么 :/ 谢谢 2 ;)

编辑:

老实说,我不知道到底发生了什么。Alpha 混合是正确的术语……这里有 2 个屏幕:

设计时添加的图标:( 来源:shs-it.de替代文字

运行时添加的图标:( 来源:shs-it.de替代文字

您关于不支持 alpha 混合的评论带来了解决方案:我在编辑器中编辑了图像并删除了“alpha blended”像素 - 现在看起来很好。但是,在运行时而不是设计时添加的图标看起来不同,这仍然很奇怪。如果您(或其他人;)可以解释一下,我会很高兴;)感谢您的支持!

4

3 回答 3

7

要支持 alpha 透明度,您需要创建图像列表并在运行时填充它:

function AddIconFromResource(ImageList: TImageList; ResID: Integer): Integer;
var
  Icon: TIcon;
begin
  Icon := TIcon.Create;
  try
    Icon.LoadFromResourceID(HInstance, ResID);
    Result := ImageList.AddIcon(Icon);
  finally
    Icon.Free;
  end;
end;

function AddPngFromResource(ImageList: TImageList; ResID: Integer): Integer;
var
  Png: TPngGraphic;
  ResStream: TStream;
  Bitmap: TBitmap;
begin
  ResStream := nil;
  Png := nil;
  Bitmap := nil;
  try
    ResStream := TResourceStream.CreateFromID(HInstance, ResID, RT_RCDATA);
    Png := TPNGGraphic.Create;
    Png.LoadFromStream(ResStream);
    FreeAndNil(ResStream);
    Bitmap := TBitmap.Create;
    Bitmap.Assign(Png);
    FreeAndNil(Png);
    Result := ImageList.Add(Bitmap, nil);              
  finally
    Bitmap.Free;
    ResStream.Free;
    Png.Free;
  end;
end;

// this could be e.g. in the form's or datamodule's OnCreate event
begin
  // create the imagelist
  ImageList := TImageList.Create(Self);
  ImageList.Name := 'ImageList';
  ImageList.DrawingStyle := dsTransparent;
  ImageList.Handle := ImageList_Create(ImageList.Width, ImageList.Height, ILC_COLOR32 or ILC_MASK, 0, ImageList.AllocBy);
  // populate the imagelist with png images from resources
  AddPngFromResource(ImageList, ...);
  // or icons
  AddIconFromResource(ImageList, ...);

end;
于 2010-06-17T12:18:43.980 回答
0

正如杰里米所说,这确实是德尔福的限制。

我用于放置在按钮上的图像(在我的例子中是具有 alpha 透明度的 PNG)的一种解决方法是将 PNG 存储为资源,并在运行时将它们绘制到一个按钮大小的位图上,其中填充了 clBtnFace。然后将位图用作控件的字形。

Delphi 对带有 alpha 掩码的图标的内置支持非常有限,但是有一个出色的图标库kicon可能会有所帮助。

于 2010-06-17T00:55:17.493 回答
0

几年前我遇到了完全相同的问题。这是一个德尔福问题。我最终在设计时将图像放入列表中,即使我真的不想这样做。我还必须使用 DevExpress 图像列表来获得最佳结果并使用 32 位彩色图像。

于 2010-06-16T23:31:38.177 回答