由于无法将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混合,就是这样.