Wir haben auf Delphi XE umgestellt. Leider habe ich das Problem der Transparenz von PNGs in Imagelisten.
Folgende Situation:
PNGs sind in einer ImageDLL gespeichert:
Auszug auf der rc Datei:
cut RCDATA "cut.png"
Um diese
Dll habe ich eine Klasse geschrieben die die Bilder dann als TPngImage zurückgibt:
Delphi-Quellcode:
function TImageDll.GetPNG(Name: string): TPngImage;
var
hLib : THandle;
begin
try
hLib := LoadLibrary(PChar(fImageDll));
Result := TPngImage.Create;
Result.LoadFromResourceName(hLib, Name);
except
end;
end;
Das wird dann wiederum in eine TImagelist gespeichert:
ilStandard.Add(sImageDll.GetPNG('cut'), nil);
ilStandard ist eine von mir erweiterte TImagelist, die zusätzlich beim Add ein GrayscaleImage in die Imagelist für die deaktivierten Bilder packt.
Delphi-Quellcode:
function TMyImageList.Add(Image, Mask: TBitmap): Integer;
begin
Result := inherited Add(Image, Mask);
if Assigned(FDisabledImages) then
begin
ConvertColors(Image);
if Assigned(Mask) then
ConvertColors(Mask);
FDisabledImages.Add(Image, Mask);
end;
end;
Ich habe schon mit Transparenz hin und her probiert, aber nichts funktioniert.
Bisher habe ich die PNGs gleich in Bitmaps umgewandelt, aber dabei geht ja die Transparenz verloren. Ich habe mich da mit TransperentColor = clBtnFace beholfen, aber das sieht im Menü leider nicht so gut aus. Die Bilder werden in TMainMenu und in TControlBar benutzt. Die TToolButtons sehen dann gut aus, aber leider ist im Menü der Hintergrund nicht (immer) clBtnFace.
Delphi-Quellcode:
function TImageDll.LoadPNG(Name: string; TransperentColor : TColor): Graphics.TBitmap;
var
hLib : THandle;
PNGImage : TPngImage;
begin
Result := Graphics.TBitmap.Create;
try
hLib := LoadLibrary(PChar(fImageDll));
PNGImage := TPngImage.Create;
PNGImage.LoadFromResourceName(hLib, Name);
PNGImage.Transparent := true;
Result.Canvas.Brush.Color := TransperentColor;
Result.Width := PNGImage.Width;
Result.Height := PNGImage.Height;
Result.Canvas.StretchDraw(Rect(0, 0, PNGImage.Width, PNGImage.Height), PNGImage);
PNGImage.Free;
except
On E : EPNGCouldNotLoadResource do
ShowMessageFmt(rcDLLFailure, [sDLLPath + rcImgDll]);
end;
end;
Ich hoffe ich hab mich verständlich ausgedrückt. Hier nochmal eine kurze Zusammenfassung was ich machen will:
1. PNGs als Resource in eine
DLL
2. PNGs mit LoadFromResourceName laden
3. PNGs in einer TImageList speichern UND dabei nicht den Alphachannel verlieren
3b. möglicherweise gleich GrayscaleImage erstellen und in eine zweite TImageList speichern
4. Bilder korrekt in TMainMenu, TToolButtons, ... anzeigen MIT richtigem Alphachannel
Mein Knackpunkt ist Nummer 3.
Vielen dank schon mal für die Antworten
David
P.S.: Uwes Vorschlag hat leider nicht geklappt.