Hi,
ich möchte eine ListView mit Bildern aus einem Ordner machen. Dazu habe ich schon ein Script im Internet gefunden, das genau das tut. Mein Problem ist aber, dass das Bilder-zur-ImageList-hinzufügen eine ganze Weile braucht, besonders wenn man ein paar mehr Bilder hat.
Daher meine Frage: Wie kann ich den Vorgang beschleunigen?
Leider kenne ich mich nicht wirklich mit GDI+ oder ImageLists aus. Meine Ideen bisher wären: Irgendwie die _GUIImageList_AddImage() optimieren, nicht gleich alle Bilder laden, sondern nur die, die gerade in der ListView angezeigt werden (habe ich aber überhaupt keine Ahnung wie), ImageList irgendwie als Datei cachen und dann davon laden (?).
[autoit]
#Include <GDIPlus.au3>
#Include <GUIImageList.au3>
#Include <GUIListView.au3>
$hForm = GUICreate('MyGUI', 400, 400)
$hListView = GUICtrlCreateListView('', 10, 10, 380, 380)
_GUICtrlListView_AddColumn($hListView, 'Items', 200)
$hImageList = _GUIImageList_Create(121, 91, 5, 1)
_GUICtrlListView_SetImageList($hListView, $hImageList, 1)
GUISetState()
For $i = 1 To 100 ;<<<<<<<<<<<<<< Hier Anzahl ändern
_GUIImageList_AddImage($hImageList, -1, "IRGENDEIN ORDNER MIT BILDERN" & $i & ".jpg") ;<<<<<<<<<<<<<<<<<< Hier Ordner einfügen
_GUICtrlListView_AddItem($hListView, $i, $i - 1)
Next
Do
Until GUIGetMsg() = -3
Func _GUIImageList_AddImage($hWnd, $iIndex, $sFile)
Local $W, $H, $hGraphic, $hPic, $hImage, $hIcon
_GDIPlus_Startup()
$hPic = _GDIPlus_ImageLoadFromFile($sFile)
$W = 121
$H = 91
$hImage = DllCall($ghGDIPDll, 'int', 'GdipGetImageThumbnail', 'ptr', $hPic, 'int', $W, 'int', $H, 'ptr*', 0, 'ptr', 0, 'ptr', 0)
$hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage[4])
_GDIPlus_GraphicsClear($hGraphic, 0)
_GDIPlus_GraphicsDrawImageRect($hGraphic, $hPic, 0, 0, $W, $H)
$hIcon = DllCall($ghGDIPDll, 'int', 'GdipCreateHICONFromBitmap', 'ptr', $hImage[4], 'ptr*', 0)
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_ImageDispose($hImage[4])
_GDIPlus_ImageDispose($hPic)
_GDIPlus_Shutdown()
If Not $hIcon[2] Then
Return -1
EndIf
$iIndex = _GUIImageList_ReplaceIcon($hWnd, $iIndex, $hIcon[2])
_WinAPI_DestroyIcon($hIcon[2])
Return $iIndex
EndFunc ;==>_GUIImageList_AddImage
Edit (3 Jahre später):
Für den Fall, dass jemand diesen Beitrag findet und das gleiche Problem hat, hier meine momentane Lösung:
Zunächst einmal hatte ich alle Bilder auch als ICO gespeichert, was das ganze schon mal deutlich beschleunigt hat. Irgendwann war es mir aber trotzdem noch zu langsam, sodass ich jetzt die Icons erst lade, wenn sie in der ListView angezeigt werden. Zunächst habe ich eine ImageList erstellt, in der jedes Icon eine weiße Fläche ist. Mit _GUICtrlListView_GetTopIndex() und _GUICtrlListView_GetCounterPage() bekommt man raus, welche Items zu sehen sind. Ist dies der Fall, ersetze ich das weiße Bild in der ImageList mit dem richtigen Icon _GUIImageList_ReplaceIcon().