4

我正在获取系统图像列表(使用 SHGetFileInfo 和 SHGFI_LARGEICON),添加两个我自己的图标并将其附加到 TListView。

问题是,如果用户的图标大小未设置为 32x32(例如设置为 48x48),Delphi7 TImageList 将失败并出现“无效图像大小”错误。

有谁知道是否有解决方法?我试过使用 TPngImageList 但它会导致其他问题。

另外,请注意,我想保留图标的 Alpha 通道。正常的 1 位透明度是不够的,因为图标往往看起来很难看。

谢谢!

4

3 回答 3

5

我不知道TImageList可以容纳的图像大小有任何限制。在我看来,你的问题是你有不同大小的图标,你不能在同一个图像列表中保存不同大小的图标。

如果您正在使用不同大小的图标,那么您将需要增加较小的图标。您必须使用位图在代码中构建它。您使用纯透明 Alpha 通道填充位图,然后将较小的图标添加到位图的中心。

另一种选择是维护两个单独的图像列表,但如果您需要将图标绘制到同一个列表视图中,那么我认为这将无法完成工作。我的猜测是你需要增加小图标。

对于 alpha,您需要自己创建图像列表句柄,因为 D7 中不存在 ColorDepth 属性。因此,原版 D7TImageList根本无法支持带有 alpha 通道的图标。

您可以通过调用ImageList_Create、传递ILC_COLOR32并将结果分配给ImageList.Handle. 在添加任何图像之前执行此操作。您必须在运行时而不是设计时填充列表,但听起来您已经在这样做了。

这是一个 48x48 工具按钮的屏幕截图,带有一个 32bpp 图标和 alpha 透明度:

图像列表中的 48px 图标

的确,我在 D2010 中制作了这个,但我上面的解决方法适用于 D7——直到最近在 D6 中我才使用该机制。我只是展示这个来证明图像列表可以容纳 48px 的图标。由于TImageList只是系统映像列表组件的包装,我相信您所尝试的应该是完全可行的。

于 2011-01-28T19:14:19.677 回答
3

就在我即将放弃此页面时,我找到了解决方案: 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;
于 2011-01-28T20:15:20.420 回答
1

TImageList 仅在 2 个条件下引发“无效图像大小”错误:

1) TImageList 的 Height 或 Width 属性小于 1,或者 Height 属性大于 32768,当 TImageList 最初是通过 CreateSize() 构造函数创建时(Height 和 Width 属性设置器没有这样的限制)。

2)您尝试添加/插入一个新的 TBitmap 或 TIcon,其尺寸不适合 TImageList 的内部图像。

于 2011-01-28T22:32:30.280 回答