在 Delphi XE2 中,我有一个带有图像缩略图的 ListView。当我单击其中一个缩略图时,我希望 ListView 被黑色半透明层覆盖,并将单击的图像放大到该层的顶部。
由于无法将 TImage 放在 ListView 之上,因此我尝试使用另一种形式,该图层的透明度为 AlphaBlend 128。然而,这种 AlphaBlend 形式也使其上的 TImage 变得 Alpha 透明。
所以目标似乎是使图层形成 AlphaBlend 透明,而不是其上的图像。如何实现这一目标?
<小时/>2012 年 8 月 7 日编辑:
解决了!!感谢雷米·勒博 (Remy Lebeau),他给了我如何塑造形象的决定性提示。我从 TMS 找到了 TW7Image,这是我所知道的唯一具有不透明度(即 AlphaBlend)属性的图像类型。我使用了这个程序:
在 W7Image 中,在 Picture 属性中加载黑色图像,将不透明度设置为 192 并设置拉伸(stretch)模式。
将其他图像设置为居中、比例等,然后:
// In this order (!):
// 1.
imgSemiTransparentBlackLayer.Parent := MyListView;
imgSemiTransparentBlackLayer.Align := alClient;
// 2.
imgTop.Picture.LoadFromFile('MyPicture.png');
imgTop.Parent := MyListView;
imgTop.Align := alClient;
最佳答案
TForm.AlphaBlend
属性适用于整个 TForm
整体。您需要的是每像素 alpha 混合,而 TForm
本身并不支持这种混合。您可以调用 UpdateLayeredWindow()
来实现每像素 Alpha,但这可能与 VCL 使用 SetLayeredWindowAttributes()
发生冲突。
对于纯 VCL 解决方案,您可以尝试使用两个 TForm
对象。让一个 TForm
仅包含 TImage
而没有背景,然后在其上面放置第二个 TForm
,其中第二个 TForm
启用了 TransparentColor
和 AlphaBlend
属性,并具有与 尺寸相同的
,并具有深色背景颜色,可与其下方的任何内容进行 alpha 混合。TransparenColorValue
正方形TImage
另一种解决方案是直接使用 Win32 API CreateWindowEx()
函数来创建图像窗口,然后您可以在其上使用 UpdateLayeredWindow()
。这需要您创建一个内存中位图来支持窗口绘制,以便您可以将图像直接绘制到该位图上,而不是使用 TImage
组件。然后,您只需给它一个深色背景,并为图像像素周围的位图像素指定每像素 alpha。
顺便说一句,如果将 TListView
设置为,您可以将 TImage
放在 TListView
之上TImage.Parent
。您只是无法对 TImage
进行 alpha 混合,仅此而已。
关于delphi - Delphi中ListView上的半透明层?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11837865/