我花了几个小时来完成这个(简单的)并且找不到解决方案:/
我正在使用D7和TImageList。 ImageList被分配给工具栏。 当我在设计时填充ImageList时,图标(具有部分透明度)看起来很好。 但我需要在运行时填充它,当我这样做时,图标看起来很糟糕 - 完全松散了部分透明度。
我只是尝试从.res文件加载图标 - 结果相同。 我尝试过第三方图像列表也没有成功。 我不知道我能做什么:/ 谢谢2全部;)
编辑:
说实话,我不知道到底发生了什么。 Alpha混合是相关术语...... 这是2个屏幕:
在设计时添加的图标: alt text http://shs-it.de/tmp/icon-designtime.JPG
运行时添加的图标: alt text http://shs-it.de/tmp/icon-runtime.JPG
您的评论不支持Alpha混合只是带来了解决方案: 我在编辑器中编辑了图像并删除了“alpha混合”像素 - 现在它看起来很好。 但是,在运行时添加图标而不是设计时,图标看起来仍然很奇怪。如果你(或其他人)可以解释它,我会很高兴;) 谢谢你的支持!
答案 0 :(得分:6)
要支持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;
答案 1 :(得分:0)
几年前我遇到了完全相同的问题。这是德尔福问题。我最终在设计时将图像放在列表中,即使我真的不想这样做。我还必须使用DevExpress图像列表来获得最佳结果并使用32位彩色图像。
答案 2 :(得分:0)
正如Jeremy所说,这确实是德尔福的限制。
我用于处理按钮(我的情况下具有Alpha透明度的PNG)的图像的一种解决方法是将PNG存储为资源,并在运行时将它们绘制到填充clBtnFace的按钮大小的位图上。然后将位图用作控件的字形。
Delphi对带有alpha蒙版的图标的内置支持非常有限,但是有一个很棒的图标库kicon可能有所帮助。