我正在获取系统图像列表(使用 SHGetFileInfo 和 SHGFI_LARGEICON),添加两个我自己的图标并将其附加到 TListView。
问题是,如果用户的图标大小未设置为 32x32(例如设置为 48x48),Delphi7 TImageList 将失败并出现“无效图像大小”错误。
有谁知道是否有解决方法?我试过使用 TPngImageList 但它会导致其他问题。
另外,请注意,我想保留图标的 Alpha 通道。正常的 1 位透明度是不够的,因为图标往往看起来很难看。
谢谢!
我正在获取系统图像列表(使用 SHGetFileInfo 和 SHGFI_LARGEICON),添加两个我自己的图标并将其附加到 TListView。
问题是,如果用户的图标大小未设置为 32x32(例如设置为 48x48),Delphi7 TImageList 将失败并出现“无效图像大小”错误。
有谁知道是否有解决方法?我试过使用 TPngImageList 但它会导致其他问题。
另外,请注意,我想保留图标的 Alpha 通道。正常的 1 位透明度是不够的,因为图标往往看起来很难看。
谢谢!
我不知道TImageList可以容纳的图像大小有任何限制。在我看来,你的问题是你有不同大小的图标,你不能在同一个图像列表中保存不同大小的图标。
如果您正在使用不同大小的图标,那么您将需要增加较小的图标。您必须使用位图在代码中构建它。您使用纯透明 Alpha 通道填充位图,然后将较小的图标添加到位图的中心。
另一种选择是维护两个单独的图像列表,但如果您需要将图标绘制到同一个列表视图中,那么我认为这将无法完成工作。我的猜测是你需要增加小图标。
对于 alpha,您需要自己创建图像列表句柄,因为 D7 中不存在 ColorDepth 属性。因此,原版 D7TImageList根本无法支持带有 alpha 通道的图标。
您可以通过调用ImageList_Create、传递ILC_COLOR32并将结果分配给ImageList.Handle. 在添加任何图像之前执行此操作。您必须在运行时而不是设计时填充列表,但听起来您已经在这样做了。
这是一个 48x48 工具按钮的屏幕截图,带有一个 32bpp 图标和 alpha 透明度:

的确,我在 D2010 中制作了这个,但我上面的解决方法适用于 D7——直到最近在 D6 中我才使用该机制。我只是展示这个来证明图像列表可以容纳 48px 的图标。由于TImageList只是系统映像列表组件的包装,我相信您所尝试的应该是完全可行的。
就在我即将放弃此页面时,我找到了解决方案: http: //delphihaven.wordpress.com/2010/09/06/custom-drawing-on-glass-2/
显然,如果您尝试在 Delphi7 中将大于 32x32 的图标添加到 timagelist 中,VCL 会给您一个“无效的图像大小”错误,而它可以简单地调用 himagelist API - 它可以轻松处理它。
这是完整的解决方案:
unit ImageListFix;
interface
uses CommCtrl, Graphics, ImgList;
type
TImageListFixer = class(TCustomImageList)
public
function AddIcon(Image: TIcon): Integer;
end;
implementation
function TImageListFixer.AddIcon(Image: TIcon): Integer;
begin
if Image = nil then
Result := Add(nil, nil)
else
begin
Result := ImageList_AddIcon(Handle, Image.Handle);
Change;
end;
end;
end.
以及将图标添加到系统图像列表的代码:
DocumentImgList:=TImageListFixer(GetSystemLargeIconsList);
IconToAdd:=TIcon.Create;
try
IconToAdd.Handle := LoadImage(0, 'c:\Ico1.ico', IMAGE_ICON, DocumentImgList.Width, DocumentImgList.Height, LR_LOADFROMFILE);
DocumentImgList.AddIcon(IconToAdd);
IconToAdd.Handle := LoadImage(0, 'c:\Ico2.ico', IMAGE_ICON, DocumentImgList.Width, DocumentImgList.Height, LR_LOADFROMFILE);
DocumentImgList.AddIcon(IconToAdd);
finally
IconToAdd.Free;
end;
TImageList 仅在 2 个条件下引发“无效图像大小”错误:
1) TImageList 的 Height 或 Width 属性小于 1,或者 Height 属性大于 32768,当 TImageList 最初是通过 CreateSize() 构造函数创建时(Height 和 Width 属性设置器没有这样的限制)。
2)您尝试添加/插入一个新的 TBitmap 或 TIcon,其尺寸不适合 TImageList 的内部图像。