在Delphi中ListView上的半透明层?

use*_*348 5 delphi image-zoom delphi-xe2

在Delphi XE2中,我有一个带有图像缩略图的ListView。当我单击其中一个缩略图时,我希望ListView被黑色半透明层覆盖,并使单击的图像放大到该层的顶部。

由于不可能将TImage放在ListView的顶部,因此我尝试对AlphaBlend 128透明度使用另一种形式的图层。但是,此AlphaBlend形式也使TImage对其具有Alpha透明性。

因此,目标似乎是使图层形成AlphaBlend透明的,而不是其上的图像。如何做到这一点?


在2012年8月7日编辑:

解决了!!多亏了雷米·勒博(Remy Lebeau),他给了我育儿形象的决定性暗示。我从TMS找到了TW7Image,这是我知道的唯一具有不透明度(即AlphaBlend)属性的图像类型。我使用了以下过程:

在W7Image中,在“图片”属性中加载“黑色”图像,将“不透明度”设置为192,并设置“拉伸”模式。

将其他图像设置为“中心”,“比例”等,然后:

// In this order (!):
// 1.
imgSemiTransparentBlackLayer.Parent := MyListView;
imgSemiTransparentBlackLayer.Align := alClient;
// 2.
imgTop.Picture.LoadFromFile('MyPicture.png');
imgTop.Parent := MyListView;
imgTop.Align := alClient;
Run Code Online (Sandbox Code Playgroud)

Rem*_*eau 4

TForm.AlphaBlend属性适用于整体TForm。您需要的是每像素 alpha 混合,而它TForm本身并不支持。您可以调用UpdateLayeredWindow()来实现每像素 alpha,但这可能与 VCL 对SetLayeredWindowAttributes().

对于纯 VCL 解决方案,您可以尝试使用两个TForm对象。让一个只TForm包含 且没有背景,然后在其上面TImage放置第二个图层,其中第二个图层同时启用了和属性,具有一个与 尺寸相同的正方形,并且具有深色背景颜色与其下面的任何内容进行 alpha 混合。TFormTFormTransparentColorAlphaBlendTransparenColorValueTImage

另一种解决方案是CreateWindowEx()直接使用Win32 API函数创建图像窗口,然后就可以使用UpdateLayeredWindow()它了。这需要您创建一个内存中位图来支持窗口绘图,以便您可以将图像直接绘制到该位图上,而不是使用组件TImage。然后,您只需给它一个深色背景,并为图像像素周围的位图像素指定每个像素的 alpha 值。

顺便说一句,如果将 a 设置为 ,则可以将 a 放在aTImage之上。你只是无法对 进行 alpha 混合,仅此而已。TListViewTListViewTImage.ParentTImage