Hallo liebe Forum-Leser!
Ich habe eine Routine geschrieben, die die Größe meiner Icon-Leisten anpasst. Die Icons werden als transparente Bitmaps mit 16x16 Pixeln in ImageListen gespeichert. Meine Routine dient dazu, eine ImageList-Komponente auf eine andere Größe zu skalieren, z.B. 32x32. Dazu kopiere ich die einzelnen Images in eine Bitmap (bmps) und skaliere diese dann in eine Ziel-Bitmap (bmpd) mit der gewünschten Ziel-Größe. Die Ziel-Bitmap wird dann in eine neue ImageListe über AddMasked hinzugefügt, wobei ich auch die Transparenz-Farbe des unteren linken Pixels mit übergebe. Soweit so gut. Funktioniert eigentlich ganz prima. Eigentlich....
Ich habe ein enormes Verständnisproblem der Funktionsweise von
TImageList.GetBitmap. Offenbar geht mir beim Einlesen eines Images meiner Imagelist über GetBitmap dessen Transparenz verloren. Das Problem verschwindet, wenn ich vor
GetBitmap(i,bmps) die Bitmap bmps über
FillRect mit einer wohldefinierten Farbe fülle. Diese Farbe darf in keinem der Icons verwendet werden.
Ich habe im nachfolgenden Beispiel mal die Füllfarbe clYellow verwendet. Das ist aber für Icons ungeeignet, die gelb als Farbe enthalten. clNone und clBackground sind ebenfalls ungeeignet. Ich verstehe einfach nicht, warum GetBitmap nicht überdeckend malt. Warum ich überhaupt die Bitmap vorher mit einer Farbe füllen muss, ist mit schleierhaft...
Meine Frage ist:
Wie kann ich mit GetBitmap ein beliebiges transparentes Image aus meiner Imageliste rausholen, ohne diese Bitmap vorher mit einer Farbe füllen zu müssen? Wie kriege ich GetBitmap dazu, dies überdeckend zu malen?
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41:
| procedure ScaleImageList(il:TImageList; destwidth,destheight:integer); overload; var newil:TImageList; i:integer; bmps,bmpd:TBitmap; begin newil:=TImageList.Create(nil); try bmps:=TBitmap.Create; try bmps.SetSize(il.Width,il.Height); bmpd:=TBitmap.Create; try bmpd.SetSize(destwidth,destheight); newil.Width:=destwidth; newil.Height:=destheight; for i:=0 to il.Count-1 do begin bmps.Canvas.Brush.Style:=bsSolid; bmps.Canvas.Brush.Color:=clYellow; bmps.Canvas.FillRect(rect(0,0,il.Width+1,il.Height+1)); il.GetBitmap(i,bmps); StretchBlt(bmpd.Canvas.Handle,0,0,destwidth,destheight,bmps.Canvas.Handle, 0,0,il.Width,il.Height,SRCCOPY); newil.AddMasked(bmpd,bmpd.Canvas.Pixels[0,bmpd.height-1]); end; il.Clear; il.Width:=destwidth; il.Height:=destheight; il.AddImages(newil); finally bmpd.Free; end; finally bmps.Free; end; finally newil.Free; end; end; |
Für Tipps, die ich auch gerne sofort ausprobiere, bin ich sehr dankbar!
Moderiert von
Martok: Topic aus VCL (Visual Component Library) verschoben am Di 11.01.2011 um 18:48