3

我有一个分配给列表视图的图像列表以显示透明图像。

关于添加的一些透明图像,这有一个小问题,那就是有时很难在列表视图中看到/找到它们。

请参阅此示例图像:

在此处输入图像描述

您会注意到图像(尤其是鼠标)几乎看不到,事实上,如果添加了空图像,您甚至都看不到它,这里的数字标题会起到拯救作用,以显示实际存在的东西。

但我想让图像在视觉上更容易看到。我想也许在透明图像下面放另一个图像会起作用——当然,尽管它不会影响实际图像。

所以考虑到这一点,我制作了一个棋盘格的位图:

在此处输入图像描述

我觉得这将是表示图像透明区域的最合适方式,就像 Paint.NET 等一样。

为了进一步说明这个例子,我修改了原始图像以显示它的外观,如果我们将棋盘位图作为底层图像:

在此处输入图像描述

有棋盘将首先表明那里有一个列表项,并且棋盘网格的位图可能更暗或完全不同的图像。正如我之前所说,如果没有图像,您将什么也看不到,所以显示一个空的国际象棋网格或其他位图总比什么都没有好。

那么,如何使用图像列表在原始图像下方显示第二张图像以提供类似于上面示例的结果?下面的图像可以是任何东西——例如,只是另一个加载的位图。

4

2 回答 2

4

如果您将棋盘存储为第一个图像(索引为 0)并从事件处理程序中的当前图像制作OnGetImageIndex覆盖图像,它将执行您想要的操作。但是,我不确定每次触发事件时制作叠加图像的效率如何。

procedure TForm1.ListView1GetImageIndex(Sender: TObject; Item: TListItem);
begin
  // make the overlay (with overlay index 1) from the 
  // image with index Item.Index + 1
  ImageList1.Overlay(Item.Index + 1, 1);
  // use the first image from the list as a background
  Item.ImageIndex := 0;
  // and assign just created overlay index for overlay
  Item.OverlayIndex := 1;
end;
于 2012-07-15T19:04:39.097 回答
1

我似乎您需要的是具有额外功能的 TImageList 。

作为一个起点,我建议您考虑在 Delphi 2006 内部一书中描述的TImageListEx

摘抄:

TImageListEx 组件是 TImageList 的后代,它可以使用来自另一个图像列表的图像来生成禁用的图像,可以在工具栏和其他用户界面元素上使用。

TImageListEx 组件是 TImageList 的后代,它可以使用来自另一个图像列表的图像来生成禁用的图像,可以在工具栏和其他用户界面元素上使用。

TImageListEx 组件有几个好处:

  • 它消除了创建禁用字形的需要。

  • 它消除了在设计时将禁用的字形添加到额外的 TImageList 组件的需要。

  • 它可以显着减小 .dfm 文件和整个应用程序的大小,尤其是在使用大量字形的大型应用程序中。

  • 它非常快,只需几毫秒即可禁用图像列表中的所有图像,即使有图像数量也是如此。

  • 它非常轻巧。(如果将其添加到已经使用标准 TImageList 组件的应用程序中,则根本不会增加可执行文件的大小,如果将其添加到不使用标准 TImageList 组件的应用程序中,则开销为只有 2 KB。)

它与您的要求相去甚远,但足够详细,可以展示如何扩展 TImageList。

于 2012-07-16T05:14:58.070 回答