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/)
-   -   16x16 Icons bei HighDPI bzw. Skalierung? (https://www.delphipraxis.net/197023-16x16-icons-bei-highdpi-bzw-skalierung.html)

MicMic 11. Jul 2018 18:25

16x16 Icons bei HighDPI bzw. Skalierung?
 
Hallo,

vielleicht hat ja jemand eine Idee.
in Delphi 10 habe ich "Hochauflösung aktivieren" (mit "Manifestdatei automatisch erzeugen") in den Projekt-Optionen aktiviert.
Da bekommt man von der System Image List (Icons) für die kleinen Icons, die 32x32 Icons zurück geliefert.
Macht auch Sinn bei großen Auflösungen aber bei einer 1920x1080 bekomme ich dann auch 32x32 Icons. Hier hätte ich aber gerne die 16x16 Icons.

Vielleicht dynamisch HighDPI an/abschalten?
Wobei ohne HighDPI die Fenster-Schaltflächen (Minimieren/Maximieren/Schließen) auch Probleme machen, sprich ein MouseOver/Enter geht da nicht so richtig.

Ich habe von SHGetFileInfo SHGFI_SMALLICON und von SHGetImageList SHIL_SMALL ausprobiert. Mit HighDPI bekomme ich immer 32x32 geliefert.

Wobei mir die Ordner-Icons bei 32x32 besser gefallen. Die sind nämlich bei 16x16 anders.
Mit "DrawIconEx" kann man nun auch skalieren. Hier habe ich probiert große/extragroße auf 16x16 herunter zu skalieren. Geht zwar aber ganz schön sind die dann auch nicht alle. In 16x16 ist halt auch nicht viel Platz. Die Icons in ein Bitmap zu kopieren und dann zu skalieren, sah noch schlechter aus. Muss ich jetzt irgendwie die Icons in PNG umwandeln und dann herunter skalieren, um eine bessere Qualität zu bekommen? Oder weiß jemand einen anderen Tipp? Beim Skalieren muss es ja irgendwie weich werden, damit es Optisch besser passt. Nur dann auch nicht zu viel weich, damit nicht alles unscharf ist :)

Michael

MicMic 11. Jul 2018 18:30

AW: 16x16 Icons bei HighDPI bzw. Skalierung?
 
Nachtrag: Vielleicht bin ich auch nur sehr empfindlich. :) Die Skalierung mit "DrawIconEx" ist eigentlich mit anderen Anwendungen vergleichbar. Aber vielleicht gibt's ja was besseres :)

KodeZwerg 11. Jul 2018 19:41

AW: 16x16 Icons bei HighDPI bzw. Skalierung?
 
Es wäre gut zu Wissen wo/wie/womit Du Icons darstellen möchtest.

jaenicke 12. Jul 2018 00:35

AW: 16x16 Icons bei HighDPI bzw. Skalierung?
 
Hast du im System eine Skalierung eingestellt? 200% vielleicht?

KodeZwerg 12. Jul 2018 06:35

AW: 16x16 Icons bei HighDPI bzw. Skalierung?
 
Delphi-Quellcode:
var
  h : HWND;
begin
  h := LoadImage(MainInstance, 'MAINICON', IMAGE_ICON, 64, 64, 0);
  Image1.Picture.Icon.Handle := h;
end;
Das obige würde ein 64x64 Icon laden was in der .exe als MAINICON definiert ist. 64x64 sollte in dieser Icon-Gruppe auch existieren.
Mit LoadImage() kann man Icons beliebiger Größe laden.

MicMic 12. Jul 2018 15:03

AW: 16x16 Icons bei HighDPI bzw. Skalierung?
 
Hier noch mal ein Beispiel-Code:
Code:
var
 SysIL : UInt;
 Result : HIMAGELIST;
 IList : TImageList;

const
 IID_IImageList: TGUID = '{46EB5926-582E-4017-9FDF-E8998DAA0950}'; // Das hab ich so im Internet gefunden

SysIL := SHGetImageList(SHIL_SMALL,IID_IImageList, Pointer(Result));
If SysIL = S_OK Then
Begin
 IList := TImageList.Create(self);
 IList.Handle := Result;
 IList.ShareImages := true;
End;
Label1.Caption := IntToStr(IList.Height);
Oder auch mit "SHGetFileInfo(... SHGFI_SYSICONINDEX or SHGFI_SMALLICON)". Ich bekomme mit der Option "Hochauflösung aktivieren" 32x32 Icons. Dabei spiel es keine Rolle, welche Skalierung und Auflösung ich nutze. Die 16x16 bekomme ich nur, wenn "Hochauflösung aktivieren" bei den Projektoptionen ausgeschaltet ist.

"LoadImage" ist wohl nicht für die System Icon Liste zu gebrauchen?

Michael

KodeZwerg 12. Jul 2018 15:50

AW: 16x16 Icons bei HighDPI bzw. Skalierung?
 
Ich muss eingestehen das was Du da machst habe ich keine Ahnung von. Wenn ich System Icons brauche, dann lade ich die, aber direkt von dll.
LoadImage() schau doch einfach mal in die Hilfe, theoretisch alles was ein Handle haben kann könnte damit aufgerufen werden, obs in Deinem Speziellen Fall genauso ist, einfach mal probieren.

MicMic 12. Jul 2018 21:53

AW: 16x16 Icons bei HighDPI bzw. Skalierung?
 
Zitat:

Zitat von KodeZwerg (Beitrag 1407038)
Ich muss eingestehen das was Du da machst habe ich keine Ahnung von. Wenn ich System Icons brauche, dann lade ich die, aber direkt von dll.
LoadImage() schau doch einfach mal in die Hilfe, theoretisch alles was ein Handle haben kann könnte damit aufgerufen werden, obs in Deinem Speziellen Fall genauso ist, einfach mal probieren.

Mit dem obigen Code wird nur die System Icon Liste zugewiesen (und halt keine 16x16er), später per Index wird dann ein Icon daraus geladen.

16x16/32x32 hin oder her... ich habe jetzt eine bessere Skalierungsfunktion.
Nicht mehr mit "DrawIconEx", sondern mit StretchBlt. So muss ich auch nicht mehr ".GetIcon" von TImageList nutzen (langsam). Also ".Draw" (schneller) von der TImageList in ein Bitmap-Canvas und mit "StretchBlt" zum Ziel-Canvas. Was mir gut gefällt ist der Wert "HALFTONE" für "SetStretchBltMode". Die Skalierung schaut um einiges besser aus. Der Wert berücksichtigt die Hintergrundfarbe des Ziel-Canvas und malt um das Icon dunklere Ränder, passend zur Hintergrundfarbe. HALFTONE nochmal halbiert wäre aber besser... die dunklen Ränder sind mir dann ein tick zu dunkel. Dies kann man wohl nicht beeinflussen.

Michael

EWeiss 12. Jul 2018 21:56

AW: 16x16 Icons bei HighDPI bzw. Skalierung?
 
nur Interesse halber..
Zitat:

Mit dem obigen Code wird nur die System Icon Liste zugewiesen (und halt keine 16x16er), später per Index wird dann ein Icon daraus geladen.
Gibt es überhaupt das 16x16 Icon in deiner Ressource ?
Ich glaube unter Win10 wurden diese entfernt, bin aber nicht sicher.
Nein nur verschiedene Farben. 16 und 256 wurden entfernt.
https://www.delphipraxis.net/attachm...ixer-mmres.jpg
https://www.delphipraxis.net/attachm...ixer-08.05.png

Wenn nicht nun dann schlägt SHIL_SMALL für diese Größe fehl.

gruss

MicMic 14. Jul 2018 07:53

AW: 16x16 Icons bei HighDPI bzw. Skalierung?
 
@EWeiss... wie ich schrieb, mit "Hochauflösung aktivieren" werden es 32x32. Sonst 16x16. Also die sind schon da.
Im übrigen ein erwartendes 32x32 wird dann 64x64. (SHGetFileInfo oder SHGetImageLis)
Das macht ja alles Sinn, wenn höhere Auflösungen genutzt werden. Skalierungsfaktor 100% oder mehr, bei allen Auflösungen (z.B. auch 800x600) liefern stets 32x32. Die Sache wird erst wieder normal (SHIL_SMALL/SHGFI_SMALLICON=16x16 Icons) wenn "Hochauflösung aktivieren" in den Projektoptionen ausgeschaltet ist.

Zum Glück geht's nun gut mit dem StretchBlt. Damit kann ich leben und der Endbenutzer dann auch :)

Michael


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:19 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