在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;
答案 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}}进行字母混合,这就是全部。