精簡版
填寫函式:
procedure LoadImageListMasked(AImageList: TImageList; hbmp: HBITMAP; TransparentColor: TColor);
var
bmp: Graphics.TBitmap;
begin
bmp := Graphics.TBitmap.Create;
bmp.Handle := hbmp;
bmp.Transparent := True;
bmp.TransparentMode := tmFixed;
bmp.TransparentColor := TransparentColor;
AImageList.AddMasked(bmp, TransparentColor);
bmp.Free;
end;
長版
我有hbmp一個 256 色位圖的句柄 ( ):

我想將此影像加載到(Delphi 5)TImageList中,使用clFuchsia作為蒙版顏色:
var
bmp: TGraphics.TBitmap;
bmp := TBitmap.Create;
bmp.Transparent := True; //Default: False
bmp.TransparentMode := tmFixed; //Default: tmAuto
bmp.TransparentColor := clFuchsia; //Default: $02FF00FF
bmp.Handle := hbmp;
ImageList1.Clear;
ImageList1.Height := bmp.Height;
ImageList1.Width := bmp.Height;
ImageList1.BkColor := clNone; //Default: $1FFFFFFF (clNone)
ImageList1.AddMasked(bmp, clFuchsia);
除非我實際使用影像串列中的影像(例如在TToolbar上),否則clFuchsia顏色不會被屏蔽:

我究竟做錯了什么?
選項網格
有多種選擇可供使用:
bmp.TransparentMode: [tmAuto,tmFixed] (默認:tmAuto)bmp.TransparentColor:TColor(默認值:-1)bmp.Transparent:布林值(默認值:假)ImageList1.BkColor: TColor (默認:clNone)
讓我們嘗試所有我能想到的組合:
| 透明模式 | 透明色 | 黑白顏色 | 結果 |
|---|---|---|---|
| tmAuto(默認) | -1(默認) | 紫紅色 | 失敗 |
| tmAuto(默認) | -1(默認) | clNone(默認) | 失敗 |
| tm固定 | 紫紅色 | clNone(默認) | 失敗 |
| tmAuto(默認) | -1(默認) | clNone(默認) | 然后分配句柄: |
| tmAuto(默認) | $02FF00FF(自動) | clNone(默認) | 失敗 |
| tmAuto(默認) | -1(默認) | clNone(默認) | 然后分配句柄: |
| tmAuto(默認) | $02FF00FF(自動) | clNone(默認) | 然后將模式更改為 tmFixed: |
| tm固定 | $02FF00FF(自動) | clNone(默認) | 失敗 |
| tmAuto(默認) | -1(默認) | clNone(默認) | 然后分配句柄: |
| tmAuto(默認) | $02FF00FF(自動) | clNone(默認) | 然后將模式更改為 tmFixed: |
| tm固定 | $02FF00FF(自動) | clNone(默認) | 然后將 TransparentColor 更改為 clFuchsia: |
| tm固定 | $02FF00FF (clFuchsia) | clNone(默認) | 失敗 |
通過 VCL 跟蹤后,我意識到TBitmap的另一個屬性:
TBitmap.Transparent: Boolean
它默認為False。我現在也嘗試將其設定為True。
uj5u.com熱心網友回復:
不要設定TImageList.BkColor,將其保留為默認值clNone。您正在告訴將TImageList其蒙版位圖繪制到TToolbar固定顏色上。這就是你TToolBar顯示紫紅色的原因。它是TImageList.BkColor被顯示的,而不是TBitmap.TransparentColor.
另外,僅供參考...
如果您TBitmap.TransparentMode想要tmAuto特定的TransparentColor.
將TransparentColor屬性設定為 以外的值clDefault會將TransparentMode屬性設定為tmFixed。然后將TransparentMode背面設定為tmAuto將背面設定TransparentColor為crDefault,從而失去您的顏色選擇。
不過,這并不重要,因為在內部會從 sourceAddMasked()創建一個新副本,并且它將復制的位圖設定為您指定的輸入,因此您實際上根本不需要使您的源是透明的。TBitmapTBitmapTransparentColorTColorTBitmap
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/484637.html
上一篇:生成OVHSHA1簽名
