Einzelnen Beitrag anzeigen

David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#9

AW: PNG zur Laufzeit in ImageList einfügen

  Alt 10. Feb 2011, 14:58
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.

Geändert von David Martens (10. Feb 2011 um 15:01 Uhr)
  Mit Zitat antworten Zitat