Hmm, geht in die richtige Richtung.Allerdings nicht so gaaaannnz das, was ich mir vorstelle. Ich habe mal eben schnell was
zusammengestrickt, was wohl am besten zeigt, was ich mir so vorstelle. Ich lese in dem Beispiel alleBilddateien des ausgewählten
Verzeichnis in eine Datenliste ein und generiere zu jeder Datei ein "Icon" zur Darstellung im ListIconGadget.
Ich komme aber irgendwie nicht so richtig mit dem Handling der ImageListe klar. Warum muss ich erst ein 0tes-Elementn hinzufügen,
damit alle Bilddateien angezeigt werden und wie kann ich die Liste zurücksetzen, wenn ich ein neues Verzeichnis auswähle.
Schaut euch doch den Beispielcode einfach mal an, aber bitte... der ist echt heiß gestrickt, haut mich nicht zu sehr
Code: Alles auswählen
UseJPEG2000ImageDecoder()
UseJPEGImageDecoder()
UseTIFFImageDecoder()
UseGIFImageDecoder()
UsePNGImageDecoder()
UseTGAImageDecoder()
Enumeration 0
#WIN_INTERFACE
#LST_PREVIEW
#TRE_FILELIST
#CON_LISTINFO: #TXT_LISTINFO
EndEnumeration
Enumeration 1000
#TEMPIMAGE
#FNT_ARIAL
EndEnumeration
;Struktur für die eingelesenen Daten erstellen (erstmal nur Dateiname, später mehr)
Structure ContentStruct
FILE.s
EndStructure
;Datenliste und globale Variablen erstellen
Global NewList CONTENT.ContentStruct()
Global imgList.l
;Ein "Dummy-Image" für die Imagelist (Element 0) erstellen (Keine Ahnung warum das nötig ist)
If CreateImage(0, 156, 156, 32)
If StartDrawing(ImageOutput(0))
StopDrawing()
EndIf
EndIf
Procedure CreateThumbnail(usrImage.l, file.s)
;Bilddatei öffnen, Daten einlesen und Grafik für die Anzeige im ListIconGadget erstellen
If LoadImage(#TEMPIMAGE, file)
Debug "Lese Bilddaten von " + file
imgW.l = ImageWidth (#TEMPIMAGE)
imgH.l = ImageHeight(#TEMPIMAGE)
imgN.s = GetFilePart(file)
imgD.s = Str(imgW) + "x" + Str(imgH) + " - " + Str(FileSize(file)/1024) + "kB"
imgT.s = FormatDate("%dd.%mm.%yyyy %hh:%ii:%ss", GetFileDate(file, #PB_Date_Modified))
;Neue Bildgrößen berechen
If imgW > imgH
relWH.f = imgH / imgW: newW = 120: newH = 120 * relWH
ElseIf imgH > imgW
relWH.f = imgW / imgH: newH = 96: newW = 96 * relWH
ElseIf imgW = imgH
newH = 120: newW = 120
EndIf
If CreateImage(usrImage, 156, 156, 32, $EAEAEA)
If StartDrawing(ImageOutput(usrImage))
DrawingFont(FontID(#FNT_ARIAL))
Box( 14, 4, 128, 104, $FFFFFF)
Box( 0, 111, 156, 54, $CAEDED)
DrawText((156 - TextWidth(imgN)) / 2, 112, imgN, $0, $CAEDED)
DrawText((156 - TextWidth(imgD)) / 2, 126, imgD, $0, $CAEDED)
DrawText((156 - TextWidth(imgD)) / 2, 140, imgT, $0, $CAEDED)
DrawingMode(#PB_2DDrawing_Outlined)
Box( 0, 0, 156, 156, $ACACAC)
Box( 14, 4, 128, 104, $B7B7B7)
DrawImage(ImageID(#TEMPIMAGE), 15 + ((126 - newW) / 2), 8 + ((96 - newH) / 2), newW, newH)
StopDrawing()
EndIf
EndIf
ImageList_Add_(imgList, ImageID(usrImage), 0)
FreeImage(#TEMPIMAGE)
EndIf
EndProcedure
Procedure ReadDirectoryEntries(usrPath.s)
;Alle Bilddateien im ausgewählten Verzeichnis auslesen und in der Datenliste speichern
;usrPath.s = GetGadgetText(#TRE_FILELIST)
pattern.s = "gif|jpeg|jpg|tga|tif|tiff|bmp|png"
Protected dir = ExamineDirectory(#PB_Any, usrPath, "*.*")
If dir
ClearList(CONTENT())
While NextDirectoryEntry(dir)
If DirectoryEntryType(dir) = #PB_DirectoryEntry_File
filename.s = usrPath + DirectoryEntryName(dir)
If FindString(LCase(pattern), LCase(GetExtensionPart(filename))) > 0
AddElement(CONTENT())
CONTENT()\FILE = filename
EndIf
EndIf
Wend
EndIf
EndProcedure
Procedure RefillListicon()
;ListIconGadget mit den Grafiken aus der Imageliste befüllen
If CountGadgetItems(#LST_PREVIEW) > 0
;Ist das Gadget bereits gefüllt, den Inhalt löschen und die Imageliste leeren
ImageList_Destroy_(imgList)
ClearGadgetItems(#LST_PREVIEW)
EndIf
imgList = ImageList_Create_(156, 156, #ILC_COLOR32|#ILC_MASK, 0, 20)
;Wenn ein 0tes Bild in die Imageliste eingefügt wird, funktioniert alles...
;ImageList_Add_(imgList, ImageID(0), 0)
;ansonsten fehlt immer das erste Element der Liste in der Anzeige
ForEach CONTENT()
CreateThumbnail(ListIndex(CONTENT()), CONTENT()\FILE)
Next
For i = 1 To ListSize(CONTENT()) - 1
AddGadgetItem(#LST_PREVIEW , -1, "", ImageID(i))
Next
oldIL = SendMessage_(GadgetID(#LST_PREVIEW), #LVM_GETIMAGELIST, #LVSIL_NORMAL, 0)
SendMessage_(GadgetID(#LST_PREVIEW), #LVM_SETIMAGELIST, #LVSIL_NORMAL, imgList)
ImageList_Destroy_(oldIL)
SendMessage_(GadgetID(#LST_PREVIEW), #LVM_SETICONSPACING, 0, 155 * 65536 + 155)
EndProcedure
If OpenWindow(#WIN_INTERFACE, 0, 0, 950, 700, "", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
LoadFont(#FNT_ARIAL, "Arial", 8)
;GUI erstellen...
ListIconGadget (#LST_PREVIEW , 299, 25, 646, 474, "", 200, #PB_ListIcon_MultiSelect)
TextGadget (#PB_Any , 5, 5, 100, 14, "Verzeichnis")
ExplorerTreeGadget(#TRE_FILELIST, 5, 25, 289, 474, "", #PB_Explorer_AlwaysShowSelection|#PB_Explorer_NoFiles|#PB_Explorer_AutoSort)
SetGadgetAttribute(#LST_PREVIEW , #PB_ListIcon_DisplayMode, #PB_ListIcon_LargeIcon)
;Events abfragen...
Repeat
EventID = WaitWindowEvent()
Select EventID
Case #PB_Event_Gadget
Select EventGadget()
Case #TRE_FILELIST
;Bei einem Verzeichniswechsel, alle Daten einlesen... funktioniert nur beim ersten mal (WARUM?)
If EventType() = #PB_EventType_LeftClick
ReadDirectoryEntries(GetGadgetText(#TRE_FILELIST))
If ListSize(CONTENT()) > 0
RefillListicon()
EndIf
EndIf
EndSelect
EndSelect
Until EventID = #PB_Event_CloseWindow
EndIf