我将提供一个非递归演示,因为它足以概述和重现我遇到的问题。
我想获得以并行线程友好方式使用的文件夹图标,但我还想确保每个图像中只有一个存储在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获取图标,并将其添加到我的树视图列表。