在Imagelist上显示辅助底层图像?

时间:2012-07-15 18:41:15

标签: delphi delphi-xe

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

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

参见此示例图片:

enter image description here

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

但我想让视觉上的图像更容易看到。我想可能在透明图像下面有另一个图像可以工作 - 当然虽然它不会影响实际图像。

因此,考虑到这一点,我制作了一个棋盘网格的位图:

enter image description here

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

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

enter image description here

拥有棋盘会指示首先存在列表项,并且棋盘网格的位图可能更暗或者是完全不同类型的图像。正如我之前所说,如果没有图像,你根本就什么都看不见,所以最好显示一个空的国际象棋网格或其他位图而不是什么。

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

我认为你需要的是具有额外功能的TImageList。

作为一个起点,我建议你考虑 Inside Delphi 2006

一书中描述的 TImageListEx

摘录:

  

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

     

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

     

TImageListEx组件有以下几个好处:

     
      
  • 无需创建禁用的字形。

  •   
  • 无需在设计时将禁用的字形添加到其他TImageList组件。

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

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

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

  •   

这远远不是您的要求,但足够详细,以展示如何扩展TImageList。