当前位置 : 主页 > 编程语言 > delphi >

Delphi中ListView的半透明层?

来源:互联网 收集:自由互联 发布时间:2021-06-23
在Delphi XE2中,我有一个带有图像缩略图的ListView.当我单击其中一个缩略图时,我希望ListView被一个黑色的半透明层覆盖,并将点击的图像放大到该层的顶部. 由于无法将TImage放在ListView之上
在Delphi XE2中,我有一个带有图像缩略图的ListView.当我单击其中一个缩略图时,我希望ListView被一个黑色的半透明层覆盖,并将点击的图像放大到该层的顶部.

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

所以目标似乎是使图层形成AlphaBlend透明而不是图像.怎么能实现这一目标?

编辑7.Aug.2012:

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

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

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

// 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属性,其中TransparenColorValue的正方形与TImage的尺寸相同,并且具有深色背景颜色,可以与其下面的任何东西进行alpha混合.

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

顺便说一句,如果将TListView设置为TImage.Parent,则可以将TImage放在TListView之上.你只是无法对TI图像进行alpha混合,就是这样.

网友评论