Delphi中ListView的半透明层?

时间:2012-08-07 00:44:33

标签: delphi delphi-xe2 image-zoom

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

由于无法将TImage放在ListView之上,我尝试使用另一种具有AlphaBlend 128透明度的图层。但是,这个AlphaBlend表单也使得它上面的TImage透明。

所以目标似乎是使图层形成AlphaBlend透明而不是图像。如何实现这一目标?


编辑7.Aug.2012:

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

在W7Image中,在Picture属性中加载黑色图像,将Opacity设置为192并设置Stretch模式。

将其他图像设置为Center,Proportional等,然后:

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

1 个答案:

答案 0 :(得分:4)

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

对于纯粹的VCL解决方案,您可以尝试使用两个TForm对象。让一个TForm仅包含TImage而不包含背景,然后在其上放置第二个TForm,其中第二个TForm同时包含TransparentColor AlphaBlend已启用TransparenColorValue属性,其TImage的正方形与CreateWindowEx()具有相同的维度,并且具有深色背景颜色,可以与其下面的任何内容进行alpha混合。< / p>

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

顺便说一句,如果您将TListView设置为TListView可以TImage.Parent置于TImage之上。您将无法对{{1}}进行字母混合,这就是全部。