ListView mit Datein füllen und richtiges Icon

Hallo,
ich will ein ListView mit Datei Namen füllen (Wie im Explorer). Dazu will ich dann gleich die richtigen Icons anzeigen, die zu der verknüpften Datei gehören.
Ist das irgendwie möglich?

Danke im voraus
Gruß
Thomas

Hallo

Ja, es gibt einen Weg. Den folgenden Quellcode kannst du in ein neues
Codemodul packen und anschliessend die Funktion
AddFileIconToImageList verwenden, um das Icon einer bestimmten
Datei zu erhalten.

Option Explicit

Public Const MAX\_PATH = 260
Public Const SHGFI\_DISPLAYNAME = &H200
Public Const SHGFI\_EXETYPE = &H2000
Public Const SHGFI\_SYSICONINDEX = &H4000
Public Const SHGFI\_LARGEICON = &H0
Public Const SHGFI\_SMALLICON = &H1
Public Const ILD\_TRANSPARENT = &H1
Public Const SHGFI\_SHELLICONSIZE = &H4
Public Const SHGFI\_TYPENAME = &H400
Public Const BASIC\_SHGFI\_FLAGS = SHGFI\_TYPENAME Or \_
 SHGFI\_SHELLICONSIZE Or SHGFI\_SYSICONINDEX \_
 Or SHGFI\_DISPLAYNAME Or SHGFI\_EXETYPE

Public Type SHFILEINFO
 hIcon As Long
 iIcon As Long
 dwAttributes As Long
 szDisplayName As String \* MAX\_PATH
 szTypeName As String \* 80
End Type

Public Declare Function SHGetFileInfo Lib "shell32" \_
 Alias "SHGetFileInfoA" (ByVal pszPath As String, \_
 ByVal dwFileAttributes As Long, psfi As SHFILEINFO, \_
 ByVal cbSizeFileInfo As Long, ByVal uFlags As Long) As Long
Public Declare Function ImageList\_Draw Lib "comctl32" \_
 (ByVal himl&, ByVal i&, ByVal hDCDest&, ByVal x&, \_
 ByVal y&, ByVal flags&amp:wink: As Long

Private shinfo As SHFILEINFO

Public Sub AddFileIconToImageList(ByVal FileName As String, \_
 ByRef TempPictureBox As PictureBox, \_
 ByRef ImageList As ImageList)
 Dim hImgSmall As Long
 Dim r As Long
 hImgSmall = SHGetFileInfo(FileName, 0&, shinfo, \_
 Len(shinfo), BASIC\_SHGFI\_FLAGS Or SHGFI\_SMALLICON)
 TempPictureBox.Picture = LoadPicture()
 r = ImageList\_Draw(hImgSmall, shinfo.iIcon, \_
 TempPictureBox.hDC, 0, 0, ILD\_TRANSPARENT)
 ImageList.ListImages.Add , , TempPictureBox.Image
End Sub

Folgende Parameter müssen übergeben werden:
FileName: Name der Datei
TempPictureBox: temporäre PictureBox mit AutoDraw = True,
Visible = False, ScaleMode = 3 - vbPixels und Width
= Height = 240

ImageList: Die ImageList, die alle Dateiicons enthalten soll.

Vorgehen:
Mit einer Schlaufe musst du alle Dateien eines Verzeichnisses
durchgehen und für jede Datei die obige Prozedur aufrufen.
Gleichzeitig fügst du die Datei dann in das ListView-Steuerelement
ein und setzt die SmallIcon-Eigenschaft jedes Elementes gleich
auf ImageList1.ListImages.Count. Am Ende der Schlaufe musst du
die SmallIcons-Eigenschaft mit dem SET-Statement auf das
entsprechende ImageList-Objekt setzen.

Ich weiss, dass diese Lösung etwas chaotisch ist, aber sie
funktioniert auf jeden Fall. Nicht vergessen: Sobald die Dateiansicht
aktualisiert wird, muss das ImageList-Objekt wieder komplett gelöscht
werden, da es sonst mit der Zeit zu viele Icons enthält.

Ich werde demnächst auf meiner Homepage ein etwas einfacheres
Tutorial für dieses Problem anbieten.

Mit freundlichen Grüssen

Samuel

Team: Name entfernt

Danke
Danke