加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi中ListView的半透明层?

发布时间:2020-12-15 09:17:17 所属栏目:大数据 来源:网络整理
导读:在Delphi XE2中,我有一个带有图像缩略图的ListView.当我单击其中一个缩略图时,我希望ListView被一个黑色的半透明层覆盖,并将点击的图像放大到该层的顶部. 由于无法将TImage放在ListView之上,我尝试使用另一种具有AlphaBlend 128透明度的表单.但是,这个AlphaB
在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混合,就是这样.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读