Seite 1 von 1

GetFileTypeIcon() (WinAPI)

Verfasst: 20.12.2005 15:54
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.

Verfasst: 20.01.2008 17:24
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 ?

Verfasst: 20.01.2008 17:33
von hardfalcon
Welcome back Lars, lange nich gesehn... <)

Hier wird noch eine alternative Methode beschrieben:
http://www.microsoft.com/germany/msdn/l ... tteln.mspx

Verfasst: 20.01.2008 17:59
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:

Verfasst: 20.01.2008 18:47
von hardfalcon
Schande über mich, da is mir das Jahr im Datum wohl entgangen... :lol:

Verfasst: 20.01.2008 18:48
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 ?

Verfasst: 20.01.2008 18:51
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:

Verfasst: 20.01.2008 18:58
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 

Verfasst: 20.01.2008 19:29
von STARGÅTE
jo thx

damit erhalte ich auch richtige Icons bei den Laufwerken danke

Verfasst: 20.01.2008 23:18
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