Seite 1 von 1
Standard-Icon ermitteln *gelöst*
Verfasst: 28.03.2009 02:20
von Regenduft
Challö miteinander,
es geht um WinAPI. Wie finde ich heraus, was für ein Icon mit einem Dateityp verknüpft ist? Bei ".txt" ist das ja z.B. standrdgemäß das Notitzblock-Icon.
Ich bin mir sicher, dass das hier irgendwo im Board schon einmal vorkam, habe es aber echt nichtmehr gefunden. In der MS Doku habe ich leider auch nichts gefunden. Bin ich mal wieder blind?
Verfasst: 28.03.2009 04:08
von STARGÅTE
Aus dem Archiv, plus beispiel
Code: Alles auswählen
Structure MySHFILEINFO
hIcon.l
iIcon.l
dwAttributes.l
szDisplayName.b[#MAX_PATH]
szTypeName.b[80]
EndStructure
Procedure.l GetExtensionIcon(DateiPfad$, Size=0, Index=0)
Protected Info.MySHFILEINFO, StandardIcon.l, Flags.l, Typ$
StandardIcon = 0
Flags = #SHGFI_ICON
If Size = 0
Flags | #SHGFI_SMALLICON
Else
Flags | #SHGFI_LARGEICON
EndIf
If Right(DateiPfad$,1) <> "\" : Left(DateiPfad$,Len(DateiPfad$)-1) : EndIf
Typ$ = GetExtensionPart(DateiPfad$)
If Typ$
Flags | #SHGFI_USEFILEATTRIBUTES
EndIf
If SHGetFileInfo_(DateiPfad$, 0, @Info.MySHFILEINFO, SizeOf(MySHFILEINFO), Flags)
StandardIcon = Info\hIcon
Else
If Size = 0
ExtractIconEx_("shell32.dll", Index, 0, @StandardIcon, 1)
Else
ExtractIconEx_("shell32.dll", Index, @StandardIcon, 0, 1)
EndIf
EndIf
ProcedureReturn StandardIcon
EndProcedure
OpenWindow(0, 0, 0, 100, 100, "Fenster", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
StringGadget(1,0,0,100,20,".txt")
ImageGadget(2,17,27,64,64, 0)
SetGadgetState(2, GetExtensionIcon(GetGadgetText(1), 0))
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_CloseWindow
End
Case #PB_Event_Gadget
Select EventGadget()
Case 1
SetGadgetState(2, GetExtensionIcon(GetGadgetText(1), 0))
EndSelect
EndSelect
ForEver
einfach eine Dateiendung eingeben und gucken ^^ zB.
.exe
.txt
.doc
Verfasst: 28.03.2009 14:46
von Andesdaf
ja, das CodeArchiv hat ganz schön was drauf!
Witzige Sache mit den Icons, auch meine selbst definierten sind dabei

Verfasst: 28.03.2009 18:50
von Regenduft
Danke Stargate! Genau was ich gesucht habe!

EDIT: Beinhaltet sogar mehr als ich ursprünglich dachte zu benötigen, da es auch Leufwerk-Icons korrekt ermittelt!
Natürlich ärgert es mich jetzt weil ich a) es im Archiv nicht gefunden habe und b) weil ich
SHGetFileInfo_() eigentlich kenne und selbst hätte drauf kommen können.
Bin also nicht nur blind sondern auch blöd!
Muss mal noch kurz erwähnen: Bin jetzt genau ein Jahr und 3 Tage im Board, aber
bin immerwieder von den schnellen, freundlichen und treffenden Antworten der Mitglieder begeistert!!!einself

Verfasst: 28.03.2009 20:15
von Andesdaf
Muss mal noch kurz erwähnen: Bin jetzt genau ein Jahr und 3 Tage im Board, aber bin immerwieder von den schnellen, freundlichen und treffenden Antworten der Mitglieder begeistert!!!einself
Bin 9 Monate und ein paar zerquetschte Tage im Forum und für mich trifft
das selbe zu

Verfasst: 31.03.2009 02:08
von Regenduft
(Das würde wohl jetzt eher in Anfänger gehören, 'n neuer Thread wäre aber wohl noch blöder.)
Was soll denn diese Zeile bringen? Die macht doch effektiv überhaupt nix, selbst wenn die If-Bedingung erfüllt ist!
Code: Alles auswählen
if Right(DateiPfad$,1) <> "\" : Left(DateiPfad$,Len(DateiPfad$)-1) : EndIf
Verfasst: 31.03.2009 02:17
von ts-soft
Da hat jemand gleiches mit ungleichem verwechselt
Hier mal der Code etwas aktueller:
Code: Alles auswählen
Procedure GetExtensionIcon(DateiPfad$, Size=0, Index=0)
Protected Info.SHFILEINFO, StandardIcon, Flags, Typ$
Flags = #SHGFI_ICON
If Size = 0
Flags | #SHGFI_SMALLICON
Else
Flags | #SHGFI_LARGEICON
EndIf
If Right(DateiPfad$,1) = "\" : Left(DateiPfad$,Len(DateiPfad$)-1) : EndIf
Typ$ = GetExtensionPart(DateiPfad$)
If Typ$
Flags | #SHGFI_USEFILEATTRIBUTES
EndIf
If SHGetFileInfo_(DateiPfad$, 0, @Info.SHFILEINFO, SizeOf(SHFILEINFO), Flags)
StandardIcon = Info\hIcon
Else
If Size = 0
ExtractIconEx_("shell32.dll", Index, 0, @StandardIcon, 1)
Else
ExtractIconEx_("shell32.dll", Index, @StandardIcon, 0, 1)
EndIf
EndIf
ProcedureReturn StandardIcon
EndProcedure
OpenWindow(0, 0, 0, 100, 100, "Fenster", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
StringGadget(1,0,0,100,20,".txt")
ImageGadget(2,17,27,64,64, 0)
SetGadgetState(2, GetExtensionIcon(GetGadgetText(1), 0))
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_CloseWindow
End
Case #PB_Event_Gadget
Select EventGadget()
Case 1
SetGadgetState(2, GetExtensionIcon(GetGadgetText(1), 0))
EndSelect
EndSelect
ForEver
Verfasst: 31.03.2009 02:22
von STARGÅTE
das ding macht immer noch kein sinn, weil das ergebnis von
Left(DateiPfad$,Len(DateiPfad$)-1)
garnicht in DateiPfad$ geschrieben wird, deswegen hatte ich den fehler nie bemerkt ...
echt peinlich ...
einfach die ganze Zeile weg oder so:
Code: Alles auswählen
If Right(DateiPfad$,1) = "\"
DateiPfad$ = Left(DateiPfad$,Len(DateiPfad$)-1)
EndIf
Verfasst: 31.03.2009 02:29
von ts-soft
hab ich einen Fehler zwar beseitigt, aber es war trotzdem sinnlos
lieber überprüfen obs eine extension gibt, weil ein pfad mit backslash am
ende wird keine datei mit gültiger extension enthalten
Was da so alles im CodeArchiv für Leichen schlummern

Verfasst: 31.03.2009 02:54
von Regenduft
Danke ts-soft und Stargate!
Ich hatte schon angefangen an meinem Grundwissen zu zweifeln!
