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! :allright:
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! :lol:

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
:allright: :praise:

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 :allright:

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 :mrgreen:
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 :mrgreen:
lieber überprüfen obs eine extension gibt, weil ein pfad mit backslash am
ende wird keine datei mit gültiger extension enthalten :mrgreen:

Was da so alles im CodeArchiv für Leichen schlummern :lol:

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