【问题标题】:Items icons with listview and imagelist带有 listview 和 imagelist 的项目图标
【发布时间】:2012-01-13 14:51:27
【问题描述】:

您好,我有一个列表视图,可以打开文件夹中的项目并显示它们。我想知道是否有办法让列表视图也显示图标,可能使用 shell32 或 imagelist。代码如下:

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/

【问题讨论】:

  • 您要显示哪个图标?像文件资源管理器那样与文件关联的那个?
  • 是的,如果是 .txt 我希望它显示 .txt 图标。

标签: vb.net listview imagelist


【解决方案1】:

你需要找到文件的扩展名以开始:

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

那么你需要在注册表的HKEY_CLASSES_ROOT部分找到这个条目:

HKEY_CLASSES_ROOT\.txt

此键中的默认值在我的情况下给出了与此文件关联的文件类型txtfile(请记住,不同的注册表可能具有不同的值,具体取决于用户设置的内容和安装的程序)

然后您需要在HKEY_CLASSES_ROOT 中查找此值DefaultIcon

HKEY_CLASSES_ROOT\txtfile\DefaultIcon

这里的默认值在我的例子中为您提供了图标的位置和图标编号:

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

从这一点上我认为你可能需要依赖ExtractIconEX API 提取图标。 This link 也可能有用

【讨论】:

  • 谢谢,但我不认为我能做到这一点,因为该程序将在多台 PC 上使用,所以如果我尝试将其定义为使用文件夹中一个文件中的图标,并且文件不存在,它会出错。
  • 是的,问题是图标嵌入在 DLL 和 EXE 中。它们不能作为图标文件使用。
  • 是的,您可以使用 ExtractIconEx 从嵌入式 DLL 或 EXE 中提取图标,您可以在找到每个文件时即时执行此操作。这些值在每台机器上可能/将会不同,这就是为什么您每次都需要读取注册表以查找要提取的图标的原因
【解决方案2】:

ListViewItems 具有ImageListImageIndexImageKey 属性。将ImageList 控件添加到您的表单(来自工具箱中的组件组)。选择图像列表后,您可以通过单击属性网格下方的“选择图像”将图像添加到ImageList。然后将图像列表和图像索引或图像键分配给您的列表项。

【讨论】:

  • 我已经尝试过这样做,但在识别扩展程序时我不断遇到错误。
  • 您的意思是,您不知道如何找到与特定文件扩展名对应的图标,并且您的问题不是显示图标,而是找到图标?
  • 两者兼而有之。我知道大多数默认图标都在 shell32.dll 上,但我不知道如何将它们导入到我在 VB 上的列表视图中,也不知道如何根据扩展名显示它们。我已经尝试了几种选择,但都没有运气,因此不胜感激。
  • Matt 向您展示了如果您想要一种程序化方法的方法。这不是一件容易的事。可能在 ImageList 中仅包含一组最常见的图标就足够了。有很多免费的图标编辑器和图标提取器可以完成提取图标的工作。
猜你喜欢
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
  • 1970-01-01
  • 2014-02-13
  • 2011-11-11
  • 1970-01-01
  • 2012-01-12
  • 1970-01-01
相关资源
最近更新 更多