Значки элементов со списком и списком изображений

Здравствуйте, у меня есть представление списка, которое открывает элементы внутри папки и отображает их. Я хочу знать, есть ли способ, чтобы в представлении списка также отображались значки, возможно, с помощью shell32 или списка изображений. Вот код:

Imports System.IO
Imports System.Xml
Imports System.Runtime.InteropServices
Imports Microsoft.VisualBasic

Public Class cv7import

Private Sub cv7import_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim caminho As String
    caminho = "C:\Documents and Settings\Software\Ambiente de trabalho\1"



    lstvicon.View = View.Details
    lstvicon.GridLines = False
    lstvicon.FullRowSelect = True
    lstvicon.HideSelection = False
    lstvicon.MultiSelect = True


    lstvicon.Columns.Add("Nome")
    lstvicon.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize)

    Dim DI As System.IO.DirectoryInfo = New System.IO.DirectoryInfo(caminho)

    Dim files() As System.IO.FileInfo = DI.GetFiles

    Dim file As System.IO.FileInfo

    Dim li As ListViewItem
    For Each file In files
        li = lstvicon.Items.Add(file.Name)
        li.Tag = file.FullName
    Next
End Sub


End Class

Вот два изображения, как это выглядит и как я хочу, чтобы это выглядело, если это поможет.

Как я хотел: http://imageshack.us/photo/my-images/21/wantd.png/

Как это выглядит: http://imageshack.us/photo/my-images/13/needk.png/


person J_Snape    schedule 13.01.2012    source источник
comment
Какой значок вы хотите показать? Тот, который связан с файлом, как это делает проводник?   -  person Matt Wilko    schedule 13.01.2012
comment
Да, если это .txt, я хочу, чтобы он показывал значок .txt.   -  person J_Snape    schedule 13.01.2012


Ответы (2)


Ну, вам нужно найти расширение файла для начала:

Dim file As String = "C:\scratch\newfile.txt"
Dim ext as string = IO.Path.GetExtension(file)

Затем вам нужно найти эту запись в разделе HKEY_CLASSES_ROOT реестра:

HKEY_CLASSES_ROOT\.txt

Значение по умолчанию в этом ключе дает тип файла, связанный с этим файлом, в моем случае txtfile (помните, что разные реестры могут иметь разные значения в зависимости от того, что настроил пользователь и какие программы установлены)

Затем вам нужно найти эти значения DefaultIcon ключа в HKEY_CLASSES_ROOT:

HKEY_CLASSES_ROOT\txtfile\DefaultIcon

Значение по умолчанию здесь дает вам расположение значка и номер значка в моем случае:

%SystemRoot%\system32\imageres.dll,-102

С этого момента я думаю, что вам, возможно, придется полагаться на ExtractIconEX API для извлечения значка. Эта ссылка также может быть полезна

person Matt Wilko    schedule 13.01.2012
comment
Спасибо, но я не думаю, что смогу это сделать, поскольку эта программа будет использоваться на нескольких ПК, поэтому, если я попытаюсь определить ее для использования значка из одного файла в папке, а файл не существует, это приведет к ошибке. . - person J_Snape; 13.01.2012
comment
Да, проблема в том, что значки встроены в DLL и EXE. Они недоступны в виде файла значка. - person Olivier Jacot-Descombes; 13.01.2012
comment
Да, вы можете извлечь значок из встроенной DLL или EXE с помощью ExtractIconEx, вы можете сделать это на лету, когда найдете каждый файл. Эти значения могут/будут отличаться на каждой машине, поэтому вам нужно будет каждый раз читать реестр, чтобы найти, какой значок извлечь. - person Matt Wilko; 13.01.2012

ListViewItems имеют свойства ImageList, ImageIndex и ImageKey. Добавьте в форму элемент управления ImageList (из группы компонентов на панели инструментов). Вы можете добавить изображения в ImageList, нажав «Выбрать изображения» под сеткой свойств, когда выбран список изображений. Затем назначьте список изображений и индекс изображения или ключ изображения элементам списка.

person Olivier Jacot-Descombes    schedule 13.01.2012
comment
Я пытался это сделать, но я продолжаю получать ошибки, когда дело доходит до идентификации расширения. - person J_Snape; 13.01.2012
comment
Вы имеете в виду, что не знаете, как найти иконку, соответствующую определенному расширению файла, и что ваша проблема не в отображении значка, а в том, чтобы найти иконку? - person Olivier Jacot-Descombes; 13.01.2012
comment
Это и то, и другое. Я знаю, что большинство значков по умолчанию находятся в shell32.dll, но я понятия не имею, как импортировать их в мой список на VB и как отображать их в соответствии с расширением. Я пробовал несколько вариантов, но мне не повезло, поэтому любая помощь приветствуется. - person J_Snape; 13.01.2012
comment
Мэтт покажет вам путь, если вам нужен программный подход. Это непросто. Может быть достаточно иметь набор только самых распространенных иконок в ImageList. Существует множество бесплатных редакторов значков и экстракторов значков, которые сделают работу по извлечению значков. - person Olivier Jacot-Descombes; 13.01.2012