2012-08-07 53 views
4

在Delphi XE2中,我有一個帶有圖像縮略圖的ListView。當我點擊其中一個縮略圖時,我想讓ListView覆蓋一層黑暗的半透明圖層,並在此圖層上放大點擊圖像。Delphi中ListView的半透明層?

由於無法將TImage放置在ListView的頂部,因此我嘗試使用AlphaBlend 128透明度的另一個窗體。但是,這個AlphaBlend表單也使Alphamage透明。

所以目標似乎是使圖層形成AlphaBlend透明,但不是它的圖像。這怎麼能實現?


編輯在7.Aug.2012:

解決!感謝雷米Lebeau,誰給了我的決定性暗示父母的形象。我從TMS發現了TW7Image,它是我所知道的具有不透明度(即AlphaBlend)屬性的唯一圖像類型。我使用這個過程:

在W7Image中,在Picture屬性中加載黑色圖像,將Opacity設置爲192並設置Stretch模式。

設置其他圖像中心,比例等,則:

// In this order (!): 
// 1. 
imgSemiTransparentBlackLayer.Parent := MyListView; 
imgSemiTransparentBlackLayer.Align := alClient; 
// 2. 
imgTop.Picture.LoadFromFile('MyPicture.png'); 
imgTop.Parent := MyListView; 
imgTop.Align := alClient; 
+0

應用AlphaBlend將貫穿整個表單,我不認爲這是你想要的。你需要做一些自定義繪圖,我個人沒有專業知識給你一個可靠的答案,但我現在可以告訴你,這裏會有一些骯髒的繪圖技巧。使用頂層的另一個VCL控件將不會是答案,但在此列表的畫布上應用整個自定義繪圖是您需要去的地方。 – 2012-08-07 00:48:23

+0

而「髒繪圖技巧」,我的意思是它會涉及到一堆額外的代碼,它不一定與德爾福一起出現,最有可能會有一些Windows API調用,並且德爾福沒有簡單的方法來做到這一點。 – 2012-08-07 01:04:16

+0

如果我可以找到一種方法來將AlphaBlend透明度僅限制到表單的某個部分,則可以輕鬆解決該問題。 – user1580348 2012-08-07 01:37:45

回答

4

TForm.AlphaBlend屬性適用於整個TForm作爲一個整體。你需要的是每像素阿爾法混合,而不是本地支持。您可以撥打UpdateLayeredWindow()來實現每個像素的alpha,但這可能與VCL使用SetLayeredWindowAttributes()相沖突。

對於純粹的VCL解決方案,您可以嘗試使用兩個TForm對象。有一個TForm只包含了TImage和沒有背景,那麼就得在它之上,其中第二TForm已同時啓用了TransparentColorAlphaBlend特性的第二TForm外行,有TransparenColorValue是相同尺寸的TImage的正方形,並有一個黑色的背景色,可以與其下面的任何東西進行混合。

另一種解決方案是使用Win32 API CreateWindowEx()函數直接創建圖像窗口,然後你可以使用UpdateLayeredWindow()就可以了。這需要您創建一個內存位圖來支持窗口繪圖,因此您可以將圖像直接繪製到該位圖上,而不是使用TImage組件。然後,您只需給它一個黑色背景,併爲圖像像素周圍的位圖像素指定每像素的alpha。

順便說一句,你可以一個TImageTListView頂部,如果你設置了TListViewTImage.Parent。你只是無法混合TImage,就這些。