Snippet

Získání ikony souboru pomocí SHGetFileInfo

Přidáno: 20.9.2007       Kategorie: VB.NET - Komponenty       Autor: Tomáš Herceg

Nedávno se v diskusi řešilo, jak získat ikonu pro nějaký soubor. Dnes jsem to potřeboval také, proto tento kód uvádím zde. Je potřeba použít API funkci SHGetFileInfo, která vrací informace o souboru. Protože tato funkce není nativní v .NET frameworku, musí se nadeklarovat jako import z knihovny. Navíc potřebuje ještě nejaké konstanty.
Ukázkový příklad potřebuje na formuláři komponenty TreeView a ImageList. Vypíše všechny soubory a složky z kořenového adresáře disku C:.

Imports System.Runtime.InteropServices

Public Class Form1

    'deklarace nutné pro použití API funkce
    Private Structure SHFILEINFO
        Public hIcon As IntPtr
        Public iIcon As Integer
        Public dwAttributes As Integer
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=260)> _
        Public szDisplayName As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=80)> _
        Public szTypeName As String
    End Structure

    Private Declare Auto Function SHGetFileInfo Lib "shell32.dll" _
            (ByVal pszPath As String, _
             ByVal dwFileAttributes As Integer, _
             ByRef psfi As SHFILEINFO, _
             ByVal cbFileInfo As Integer, _
             ByVal uFlags As Integer) As IntPtr

    Private Const SHGFI_ICON = &H100
    Private Const SHGFI_SMALLICON = &H1
    Private Const SHGFI_LARGEICON = &H0
    '------------------------------------------------------
    
    Private Function GetFileIcon(ByVal f As String) As Icon
        'získat ikonu
        Dim shinfo As New SHFILEINFO()
        SHGetFileInfo(f, 0, shinfo, Marshal.SizeOf(shinfo), SHGFI_ICON Or SHGFI_SMALLICON)
        Return System.Drawing.Icon.FromHandle(shinfo.hIcon)
    End Function

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim i As Integer = 0
        'vypsat složky
        For Each f As String In IO.Directory.GetDirectories("c:\")
            ImageList1.Images.Add(GetFileIcon(f))
            TreeView1.Nodes.Add("im" & i, IO.Path.GetFileName(f), i, i)
            i += 1
        Next
        'vypsat soubory
        For Each f As String In IO.Directory.GetFiles("c:\")
            ImageList1.Images.Add(GetFileIcon(f))
            TreeView1.Nodes.Add("im" & i, IO.Path.GetFileName(f), i, i)
            i += 1
        Next
    End Sub

End Class 
 

VBNET.CZ | © 2007 Tomáš Herceg, Tomáš Jecha | Kopírování a přejímání jakéhokoliv obsahu z tohoto webu je bez písemného svolení autorů zakázáno.