Am Besten läßt sich das Ganze wohl am Explorer
verdeutlichen, da dieser genau das hier zu beschreibende nutzt. Auch dort sehen Sie vor
einer *.doc Datei,
das Icon für MS Winword (soweit vorhanden) und vor einer *.jpg Datei, das Icon der
Grafikanwendung, die sich öffnet, wenn Sie einen Doppelklick darauf ausführen.
Das geschieht natürlich nicht von Wunderhand, sondern im System sind die Verknüpfungen
gespeichert und so, wie eben ein Doppelklick auf eine Datei, die verknüpfte Anwendung
startet, so kann man auch ermitteln, welches Icon diese Anwendung besitzt und ggf. seinen
Dateimanager auch diese Funktionalität geben.
1.
Für ein Demoprojekt basteln Sie sich bitte eine Drive-, Dir- und FileListBox auf
Ihre Form und verbinden diese. Dies ist lediglich zur
Dateiauswahl notwendig.
Desweiteren benötigen wir noch zwei Pictureboxen zur Anzeige der Icons.
( Picture1 / Picture2 ) 2.
Unter Allgemein/Deklarationen der form geben Sie folgende Deklarationen an.
Const MAX_PATH = 260
Const SHGFI_TYPENAME = &H400&
Const SHGFI_DISPLAYNAME = &H200
Const SHGFI_LARGEICON = &H0
Const SHGFI_SMALLICON = &H1
Const SHGFI_SYSICONINDEX = &H4000
Const SHGFI_SHELLICONSIZE = &H4
Const SHGFI_EXETYPE = &H2000
Const BASIC_SHGFI_FLAGS = SHGFI_TYPENAME Or SHGFI_SHELLICONSIZE _
Or SHGFI_SYSICONINDEX Or SHGFI_DISPLAYNAME Or _
SHGFI_EXETYPE
Private Type SHFILEINFO
hIcon As Long
iIcon As Long
dwAttributes As Long
szDisplayName As String * MAX_PATH
szTypeName As String * 80
End Type
Private Declare Function ImageList_Draw Lib
"comctl32.dll" (ByVal himl&, ByVal I&, ByVal hDCDest&, ByVal X&,
ByVal Y&, ByVal flags&) As Long
Private Declare Function SHGetFileInfo Lib "shell32.dll" Alias
"SHGetFileInfoA" (ByVal pszPath As String, ByVal dwFileAttributes As Long, psfi
As SHFILEINFO, ByVal cbFileInfo As Long, ByVal uFlags As Long) As Long
3.
Nun benötigen wir die eigentliche Prozedur zum Ermitteln der Programmicons
Sub GiveFileIconFromReg(FileName As String, Optional
Small As PictureBox = Null,
Optional Large As PictureBox = Null)
Dim hImgSmall As Long, hImgLarge As Long
Dim FileInfo As SHFILEINFO
Dim R As Long
If IsNull(Small) = False Then
Small.Picture = LoadPicture()
Small.Cls
Small.AutoRedraw = True
DoEvents
hImgSmall = SHGetFileInfo(FileName, 0&, FileInfo, Len(FileInfo),
BASIC_SHGFI_FLAGS Or SHGFI_SMALLICON)
DoEvents
R = ImageList_Draw(hImgSmall&, FileInfo.iIcon, Small.hDC, 0, 0,
ILD_TRANSPARENT)
Small.Picture = Small.Image
Small.AutoRedraw = False
End If
If IsNull(Large) = False Then
Large.Picture = LoadPicture()
Large.Cls
Large.AutoRedraw = True
DoEvents
hImgLarge = SHGetFileInfo(FileName, 0&, FileInfo, Len(FileInfo),
BASIC_SHGFI_FLAGS Or SHGFI_LARGEICON)
DoEvents
R = ImageList_Draw(hImgLarge&, FileInfo.iIcon, Large.hDC, 0, 0,
ILD_TRANSPARENT)
Large.Picture = Large.Image
Large.AutoRedraw = False
End If
End Sub
4.
Der FileListBox übergeben wir nun in der Doppelklick Methode den Aufruf zum
Ermitteln der zugeordneten ProgrammIcons.
Private Sub File1_DblClick()
If Right(Dir1, 1) = "\" Then
Call GiveFileIconFromReg(Dir1 & File1, Picture1, Picture2)
Else
Call GiveFileIconFromReg(Dir1 & "\" & File1, Picture1,
Picture2)
End If
End Sub
Sie erkennen sicher schon, was der Aufruf so an Angaben
benötigt.
* den Pfad zur Datei
* Den Namen der Picturebox für das 32x32 Pixel Icon
* Den Namen der Picturebox für das 16x16 Pixel Icon
5.
Starten Sie mit F5 Ihr Projekt und wählen eine Datei aus. Wenn Sie nun einen
Doppelklick auf die Datei ausführen, so werden Ihnen die Icons, der diesem Dateityp
zugeordneten Programm angezeigt. |