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,
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&: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