delphi - Delphi中ListView上的半透明层?

标签 delphi delphi-xe2 zooming

在 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 启用了 TransparentColorAlphaBlend 属性,并具有与 尺寸相同的 TransparenColorValue 正方形TImage,并具有深色背景颜色,可与其下方的任何内容进行 alpha 混合。

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

顺便说一句,如果将 TListView 设置为,您可以TImage 放在 TListView 之上TImage.Parent。您只是无法对 TImage 进行 alpha 混合,仅此而已。

关于delphi - Delphi中ListView上的半透明层?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11837865/

相关文章:

delphi - 如何按描述对 TcxImageComboBox 的项目进行排序?

delphi - 有什么方法可以限制CodeCentral Web服务返回多少项目

delphi - 阻止 XSLT 转换将 utf-8 XML 转换为 utf-16?

unity3d - 当我放大 Unity 时 Sprite 消失

delphi - 我的程序如何对 TDateTimePicker 中的更改使用react?

delphi - 如何在 Delphi 中添加和使用自定义包/组件中的资源?

Windows PaintDesktop版本

delphi - Overbyte ICS HTTPS POST

javascript - 通过添加缩放来改进序列旭日

zooming - Openlayers 放大集群