Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Icons ohne Schwarzen Rand (https://www.delphipraxis.net/18330-icons-ohne-schwarzen-rand.html)

neolithos 16. Mär 2004 20:05


Icons ohne Schwarzen Rand
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hat irgentwer schon herausbekommen wie man die Windows-Icons ohne diesen Schwarzen schatten zeichnet?

Stanlay Hanks 16. Mär 2004 20:11

Re: Icons ohne Schwarzen Rand
 
Hi. Das sind glaube ich Schatten, oder? Öffne die Icons mit Photoshop oder einem Icon Editor und lösche das schwarze raus. sollte funktionieren. :gruebel:

Man liest sich, Stanlay :hi:

neolithos 16. Mär 2004 20:15

Re: Icons ohne Schwarzen Rand
 
Ich hol mir aber die Icons per

ExtractFileIcon

da kann man leider nur schlecht drinnerrum löschen.

neolithos 16. Mär 2004 20:27

Re: Icons ohne Schwarzen Rand
 
Erkenntnis:

DrawIconEx stellt das Symbol ohne Probleme dar.

Nur mit ImageList_Draw habert es noch! Weis jemand was?

NicoDE 16. Mär 2004 20:59

Re: Icons ohne Schwarzen Rand
 
Zitat:

Zitat von neolithos
Nur mit ImageList_Draw habert es noch! Weis jemand was?

Setz die Hintergrundfarbe der ImageList auf die Farbe des ListView.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  IconCount: Integer;
  IconIndex: Integer;
  LargeIcon: HICON;
  IconObject: TIcon;
  ListItem: TListItem;
begin
  ListView1.Clear();
  ImageList1.Clear();
  ImageList1.BkColor := ListView1.Color; // <- wichtig :)
  IconCount := ExtractIconEx(shell32, -1, HICON(nil^), HICON(nil^), 0);
  if IconCount > 0 then
  begin
    ImageList1.Width := GetSystemMetrics(SM_CXICON);
    ImageList1.Height := GetSystemMetrics(SM_CYICON);
    for IconIndex := 0 to IconCount - 1 do
    begin
      LargeIcon := 0;
      if (ExtractIconEx(shell32, IconIndex, LargeIcon, HICON(nil^), 1) > 0) and
        (LargeIcon <> 0) then
      try
        IconObject := TIcon.Create();
        try
          IconObject.Handle := LargeIcon;
          ImageList1.AddIcon(IconObject);
          ListItem := ListView1.Items.Add();
          ListItem.Caption := '#' + IntToStr(IconIndex);
          ListItem.ImageIndex := IconIndex;
        finally
          IconObject.Free();
        end;
      finally
        DestroyIcon(LargeIcon);
      end;
    end;
  end;
end;

neolithos 16. Mär 2004 21:21

Re: Icons ohne Schwarzen Rand
 
Danke!

BkColor ->

Daraus schließe ich das in der ImageList_Draw nur die Bitmaps gezeichnet werden. Und die ImageList eigentlich gar nicht mit Icons umgehen kann.

neolithos 16. Mär 2004 21:31

Re: Icons ohne Schwarzen Rand
 
Da ich auch einmal auf einen "mehrfarbigen" Hintergrund zeichnet...

Delphi-Quellcode:
var hIco : Cardinal;
    ptImage : TPoint;

...

hIco := ImageList_GetIcon(fLinks.fImgs.Handle, iIndex, ILD_NORMAL);
DrawIconEx(hDC, ptImage.x, ptImage.y, hIco, 16, 16, 0, 0, DI_NORMAL);
DestroyIcon(hIco);
***

Suchbegriff zum Finden: Using 32-Bit Anti-Aliased Icons

NicoDE 16. Mär 2004 21:53

Re: Icons ohne Schwarzen Rand
 
Zitat:

Zitat von neolithos
Und die ImageList eigentlich gar nicht mit Icons umgehen kann.

Das schon, nur bin ich nicht sicher, ob man der TImageList (sieht nicht so aus als ob Du sie verwendest, aber davon bin ich ausgegangen :)) ILC_COLOR32 beibringen kann...

[edit]Ein Hack für die VCL-ImageList könnte so aussehen
Delphi-Quellcode:
    with ImageList1 do
    begin
      Clear();
      ImageList := ImageList_Create(Width, Height, ILC_COLOR32 or ILC_MASK,
        0, AllocBy);
      if ImageList <> 0 then
      begin
        ImageList_SetBkColor(ImageList, BkColor);
        Masked := True;
        Handle := ImageList;
      end;
    end;
[/edit]

Thunderchild 16. Mär 2004 22:13

Re: Icons ohne Schwarzen Rand
 
Zitat:

Zitat von neolithos
Hat irgentwer schon herausbekommen wie man die Windows-Icons ohne diesen Schwarzen schatten zeichnet?

Das kommt am wahrscheinlichsten daher, daß das XP-Icons mit Alpha-Kanal sind, aber Win2k damit nicht umgehen kann.

neolithos 16. Mär 2004 22:36

Re: Icons ohne Schwarzen Rand
 
@Thunderchild:

Das ist mir klar! Und das was bis jetzt an Code geliefert wurde läuft auch ohne weiteres unter Win2k.

@NicoDE:

Ich meinte mit diesem Satz eigentlich nur, das intern in der ImageList von Windows alles auf zwei Bitmaps zurückgeführt wird (Maske und Image). Daher meine Vermutung das ImageList_Draw die zwei Bilder nur kombiniert, aber den Alpha-Kanel (Byte 4) völlig außer acht lässt.

Wird eine Hintergrundfarbe gesetzt (ich habe es getestet), ist dies nur eine Grücke. Da das Icon bei ImageList_AddIcon in die Maske und Image reingezeichnet wird (via DrawIcon o.ä.). Hat das Image nun die Hintergrundfarbe z.B. weiß, so wird das Symbol bei ImageList_Draw später korrekt dargestellt, falls ein Weißer Hintergrund darunter liegt.

Da ich aber bei Selection einen Farbverlauf von Blau zu weiß dem Symbol unterlege, würde es statt einem Schwarzen einen Weißen rand geben. -> Daher verwende ich in diesem Fall DrawIcon o.ä.

Grund: Wird ein Icon erstellt zu wird die Maske mit dem Image wieder als Icon zurückgegeben. Da vorher ILC_COLOR32 eingestellt wurde, wird der Aplha-Kanal korrekt mit kopiert.

NicoDE 16. Mär 2004 23:18

Re: Icons ohne Schwarzen Rand
 
Zitat:

Zitat von neolithos
Wird eine Hintergrundfarbe gesetzt (ich habe es getestet), ist dies nur eine Grücke.

Da sind wir uns einig. Deswegen habe ich oben versucht die VCL-ImageList zu manipulieren (32-Bit) - ob das Deine Probleme auch beheben würde, wäre interessant zu erfahren... (geht aus Deinem Beitrag leider nicht hervor, oder ich bin zu müde :)).

alcaeus 17. Mär 2004 05:49

Re: Icons ohne Schwarzen Rand
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das Problem könnte vielleicht deshalb bestehen, da die Icons unter WinXP ja nicht mehr Icons im eigentlichen Sinne sind, sondern Bitmaps mit 16,7 Mio. Farben. Das angehängte Bild müsste eigentlich den Unterschied deutlich darlegen: Links der Screenshot auf meinem XP-Rechner, rechts der Ausschnitt aus dem oben geposteten Image.

NicoDE 17. Mär 2004 06:09

Re: Icons ohne Schwarzen Rand
 
Zitat:

Zitat von alcaeus
Das Problem könnte vielleicht deshalb bestehen, da die Icons unter WinXP ja nicht mehr Icons im eigentlichen Sinne sind, sondern Bitmaps mit 16,7 Mio. Farben.

Das Problem ist eher, dass die XP-Icons 32 Bit RGBA enthalten und in eine ImageList gestopft werden, die nur 24 Bit RGB Daten speichert (dabei geht logischerweise die Teiltransparenz des Alpha-Kanals verloren und die Transparenz wird durch die verwendete Maske auf 1 Bit reduziert).

neolithos 17. Mär 2004 09:28

Re: Icons ohne Schwarzen Rand
 
Zitat:

Zitat von NicoDE
Da sind wir uns einig. Deswegen habe ich oben versucht die VCL-ImageList zu manipulieren (32-Bit) - ob das Deine Probleme auch beheben würde, wäre interessant zu erfahren...

Ein klares Nein, denn ich habe mal zum Test eine ImageList per Api-Funktionen erstellt mir ILC_COLOR32 und da trat der selbe Fehler auf. Die einzige Chance die ich derzeit sehe ist die Rückwandlung zu einem Icon. Und so habe ich es derzeit Implementiert, siehe 7-ten von oben.

NicoDE 17. Mär 2004 10:17

Re: Icons ohne Schwarzen Rand
 
Zitat:

Zitat von neolithos
ich habe mal zum Test eine ImageList per Api-Funktionen erstellt mir ILC_COLOR32 und da trat der selbe Fehler auf.

Bei mir auch (siehe VCL-Hack), deswegen kommt noch ILC_MASK dazu (die Hintergrundfarbe der ImageList spielte dann keine Rolle mehr - so wie es sein sollte...).


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz