TreeView文件夹列表递归地与缓存中的图标和ImageList中的NO重复

时间:2016-08-05 02:27:20

标签: c# winforms treeview icons pinvoke

我将提供一个非递归演示,因为它足以概述和重现我遇到的问题。

我想获得以并行线程友好方式使用的文件夹图标,但我还想确保每个图像中只有一个存储在ImageList中,因此,如果有100个文件夹,那么97他们使用系统文件夹图标,2使用回收站图标,1使用驱动器图标,我只想在ImageList中有3个图标。

以下代码设置了它所属的树视图控件的“root”文件夹:

public void SetRoot(string path)
{
    Tag = path;
    var dirs = Directory.EnumerateDirectories(path).OrderBy(d => d).Select(d => d.Split(Path.DirectorySeparatorChar).Last());
    TreeNode node;
    string folder;
    foreach (var d in dirs) {
        node = Nodes.Add(d);
        folder = Path.Combine(path, d);

        // some check to see if the image is in the list already, if not add it, else get the index of the image in the list and don't add again            
        // set to int ImageListIconIndex

        // ImageList.Add( ..... code here for icon ..... );
        Nodes.Add(d,d, ImageListIconIndex);
    }
}

我尝试了以下api调用:

P /调用

  

ExtractIcon / ExtractIconEx

这些调用似乎只适用于文件

原生电话

  

Icon.GetAssociatedIcon

这似乎只适用于文件

我做了一些挖掘,发现了一些API,一眼就看起来可能有效,但记录很差(甚至p / invoke的网站除了声明之外几乎没有什么可说的),如下所示:

LookupIconIdFromDirectoryEx - *关于如何使用此API的信息非常少。我能够从信息here on pinvoke.net中分配声明,这是姊妹电话LookupIconIdFromDirectory

这些调用似乎需要另一个调用才能实际加载资源,但由于缺少有关此API的文档,因此确定这些调用是什么(或许GetResourceEx),或者文件/他们将调用的系统的一部分将该图标Id(从目录中查找图标Id)转换为实际的图标图像。

最终目标是能够(尽可能高效,快速 - 无需将实际图像或图像指针加载到内存中,直到确认需要将其添加到内存中{{1} })如果列表中不存在图标,则仅加载并向树视图图像列表添加新图标。我喜欢获取图像id的理论概念(ImageList暗示它的作用),并检查我的列表中是否有该ID,如果没有,请通过该ID获取图标,并将其添加到我的树视图列表。

0 个答案:

没有答案