首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi和48x48 (或更大的) imagelists有解决办法吗?

Delphi和48x48 (或更大的) imagelists有解决办法吗?
EN

Stack Overflow用户
提问于 2011-01-29 02:50:27
回答 3查看 5.8K关注 0票数 4

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

问题是,如果用户的图标大小没有设置为32x32 (例如,设置为48x48 ),Delphi7 TImageList将失败,并显示"Invalid image size“错误。

有没有人知道是否有可用的解决办法?我尝试过使用TPngImageList,但它导致了其他问题。

另外,请注意,我希望保留图标的Alpha通道。普通的1位透明度是不够的,因为图标往往看起来很丑陋。

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-29 04:15:20

就在我正要放弃的时候,这个页面让我找到了解决方案:http://delphihaven.wordpress.com/2010/09/06/custom-drawing-on-glass-2/

显然,如果你试图在Delphi7中添加一个大于32x32的图标到一个图像列表中,VCL会给你一个“无效图像大小”的错误,而它可以简单地调用himagelist API --它可以很容易地处理它。

以下是完整的解决方案:

代码语言:javascript
复制
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.

以及将图标添加到系统镜像列表的代码:

代码语言:javascript
复制
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;
票数 3
EN

Stack Overflow用户

发布于 2011-01-29 03:14:20

我没有意识到TImageList可以容纳的图像大小有任何限制。在我看来,你的问题是你有不同大小的图标,并且你不能在同一图像列表中容纳不同大小的图标。

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

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

对于alpha,您需要自己创建图像列表句柄,因为D7中不存在ColorDepth属性。正因为如此,普通的D7 TImageList根本不能支持带有alpha通道的图标。

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

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

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

票数 5
EN

Stack Overflow用户

发布于 2011-01-29 06:32:30

仅在两种情况下,TImageList会引发"Invalid image size“错误:

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

2)您尝试添加/插入一个尺寸与TImageList的内部镜像不匹配的新TBitmap或TIcon。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4831927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档