GetFileTypeIcon() (WinAPI)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Lars
Beiträge: 347
Registriert: 31.08.2004 23:53
Wohnort: Shanghai
Kontaktdaten:

GetFileTypeIcon() (WinAPI)

Beitrag von Lars »

Danke an pcfreak, der mir das Prinzip für folgendes Snippet zur Verfügung stellte:

Code: Alles auswählen

Procedure.l GetExtensionIcon(extension.s, Size.l)
  Protected Info.SHFILEINFO, StandardIcon.l, flags.l
  
  StandardIcon = 0
  
  If Size = 0
    flags = #SHGFI_USEFILEATTRIBUTES | #SHGFI_ICON | #SHGFI_SMALLICON
  Else
    flags = #SHGFI_USEFILEATTRIBUTES | #SHGFI_ICON | #SHGFI_LARGEICON
  EndIf
  
  If SHGetFileInfo_("." + extension, #FILE_ATTRIBUTE_NORMAL, @Info.SHFILEINFO, SizeOf(SHFILEINFO), flags)
    StandardIcon = Info\hIcon
  Else 
    If Size = 0
      ExtractIconEx_("shell32.dll", 0, 0, @StandardIcon, 1)
    Else
      ExtractIconEx_("shell32.dll", 0, @StandardIcon, 0, 1)
    EndIf
  EndIf
  
  ProcedureReturn StandardIcon
EndProcedure


; Small example code
extension.s = "txt"

If OpenWindow(0, 0, 0, 100, 100, #PB_Window_ScreenCentered | #PB_Window_SystemMenu, "DefaultIcon for " + extension) 
  If CreateGadgetList(WindowID()) 
    ExtIcon = GetExtensionIcon(extension, 1)
    ImageGadget(0, 10, 10, 32, 32, ExtIcon) 
    
    Repeat 
    Until WaitWindowEvent() = #PB_EventCloseWindow  
  EndIf 
EndIf 
  
DestroyIcon_(ExtIcon) 

End
Der Code gibt ein Windows Handle des Defaulticons für einen Dateityp
zurück - halt das Icon, dass einem der Explorer anzeigt.

Das Icon ist entweder Small oder Big, je nachdem, ob man bei der
Size 0 oder 1 angibt.

Das Icon sollte man nach der Benutzung mit DestroyIcon_(IconHandle) wieder freigeben.
Lars
The only problem with troubleshooting is, that sometimes the trouble shoots back.
P4 2,6Ghz, 512MB RAM, GeForce 6200, WinXP Pro SP2, PB V3.94
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

danke erst mal für den Code, hilft mir sehr.

Aber ich habe da eine frage. Wenn ich ein Ordner habe, dann hat dieser ja kein Typ, aber wie bekomme ich dann das Icon von ihm ?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Welcome back Lars, lange nich gesehn... <)

Hier wird noch eine alternative Methode beschrieben:
http://www.microsoft.com/germany/msdn/l ... tteln.mspx
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

hardfalcon hat geschrieben:Welcome back Lars, lange nich gesehn... <)
Stimmt, denn dies ist sein letzter Post und der ist schon 3 Jahre alt... :lol:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Schande über mich, da is mir das Jahr im Datum wohl entgangen... :lol:
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

ist ja ganz nett aber könnte mir jemand meine Frage beantworten ?
Im Link steht auch nix.
Aber ich habe da eine frage. Wenn ich ein Ordner habe, dann hat dieser ja kein Typ, aber wie bekomme ich dann das Icon von ihm ?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Ich würde dir gerne helfen, aber ich hab grad kein Windows zur Hand. Ich versuch bin grad dabei, die Daten von der Linux-Partition zu retten, die Windows XP mir bei der Installation einfach von der 1. Festplatte gelöscht hat, um dort seinen Bootmanager zu installieren (obwohl ich Windows selbst auf die 2. Platte installiert habe). Danach muss ich mir den MBR noch hinbiegen, der is leider zu Bruch gegangen, als testdisk meine Linux-Partition wiederhergestellt hat. Dauert also noch ein paar Stunden... :wink:
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

STARGÅTE hat geschrieben:ist ja ganz nett aber könnte mir jemand meine Frage beantworten ?
Hilft Dir das hier im englischen Forum vielleicht ?

[edit 18:05]
habs ma schnell nach PB 4.1 geändert, waren nur 3 oder 4 Stellen ;)

Code: Alles auswählen

; user: freak
; forum: http://www.purebasic.fr/english/viewtopic.php?t=6352
;
; SHFILEINFO structure is incorrect in PB, got to go fix that...
Structure MySHFILEINFO
  hIcon.l
  iIcon.l
  dwAttributes.l
  szDisplayName.b[#MAX_PATH]
  szTypeName.b[80]
EndStructure


; The String can be any file on your disk, or a directory name. You will receive
; the same Icon, the M$ Explorer displays for this folder/file.

If SHGetFileInfo_("C:\Windows", 0, @Info.MySHFILEINFO, SizeOf(MySHFILEINFO), #SHGFI_ICON|#SHGFI_LARGEICON)
  IconHandle = Info\hIcon

  ; display the icon

  If OpenWindow(0,0,0,100,100, "Icon",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
    If CreateGadgetList(WindowID(0))
     
      ImageGadget(0, 10, 10, 32, 32, IconHandle)
     
      Repeat
      Until WaitWindowEvent() = #PB_Event_CloseWindow 
   
    EndIf
  EndIf
 
  ; Free the Icon handle:
  ; When your app ends, windows will free all icon handles, so you don't
  ; necessary need to do it. However, if you load a lot of these icons, it
  ; might be a good deal to free all those you don't need anymore, to keep
  ; the system recources free.
  DestroyIcon_(IconHandle)
 
Else
  MessageRequester("Error!","Could not get File/Folder Info",0)
EndIf

End 
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

jo thx

damit erhalte ich auch richtige Icons bei den Laufwerken danke
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Das is genug:

Code: Alles auswählen

If OpenWindow(0, 0, 0, 400, 400, "test", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
	If CreateGadgetList(WindowID(0))
		ListIconGadget(0, 10, 10, 380, 380, "Path", 380)
		If ExamineDirectory(0, "C:\WINDOWS\", "")
			While NextDirectoryEntry(0)
				SHGetFileInfo_("C:\WINDOWS\" + DirectoryEntryName(0), 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_ICON)
				AddGadgetItem(0, -1, DirectoryEntryName(0), InfosFile\hIcon)
			Wend
			FinishDirectory(0)
		EndIf
		Repeat
		Until WaitWindowEvent() = #PB_Event_CloseWindow
	EndIf
EndIf
Antworten