Тема: Listview підвантаження системних іконок
Добрий день, допоможіть вирішити проблему я написав ось такий код. Код для завантаження іконок знайшов в інтернеті і переробив його під свій провідник.
using System.Runtime.InteropServices;
public partial class Form1 : Form
{
IntPtr hImgLarge;
System.Drawing.Icon largeIcon;
SHFILEINFO shinfo = new SHFILEINFO();
public struct SHFILEINFO
{
public IntPtr hIcon;
public int iIcon;
public uint dwAttributes;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string szDisplayName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string szTypeName;
};
[DllImport("Shell32.dll")]
private static extern IntPtr SHGetFileInfo(string pszPath,
uint dwFileAttributes, ref SHFILEINFO psfi, int cbFileInfo, uint uFlags);
public Form1()
{
InitializeComponent();
GetDriveNodes();
}
private void GetDriveNodes()
{
try
{
foreach (string path in Environment.GetLogicalDrives())
if (new DirectoryInfo(path).Exists)
{
TreeNode driveNode = new TreeNode { Text = path };
FillTreeNode(driveNode, path);
treeView1.Nodes.Add(driveNode);
}
}
catch (Exception) { }
}
void treeView1_GetFolders(object sender, TreeViewCancelEventArgs e)
{
try
{
foreach (var dir in Directory.GetDirectories(e.Node.FullPath))
{
TreeNode dirNode = new TreeNode(new DirectoryInfo(dir).Name);
FillTreeNode(dirNode, dir);
e.Node.Nodes.Add(dirNode);
}
}
catch (Exception) { }
}
void treeView1_GetFiles(object sender, TreeViewCancelEventArgs e)
{
try
{
foreach (var dir in Directory.GetFiles(e.Node.FullPath))
{
TreeNode dirNode = new TreeNode(new DirectoryInfo(dir).Name);
FillTreeNode(dirNode, dir);
e.Node.Nodes.Add(dirNode);
}
}
catch (Exception) { }
}
void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
e.Node.Nodes.Clear();
treeView1_GetFolders(sender, e);
treeView1_GetFiles(sender, e);
GetItems(e.Node.FullPath);
}
private void FillTreeNode(TreeNode driveNode, string path)
{
try
{
foreach (string dir in Directory.GetFileSystemEntries(path))
{
TreeNode dirNode = new TreeNode();
driveNode.Nodes.Add(dirNode);
}
}
catch (Exception) { }
}
private void listView1_GetFolders(string[] folders, ImageList largeImageList)
{
try
{
foreach (string f in folders)
{
hImgLarge = SHGetFileInfo(f, 0, ref shinfo, Marshal.SizeOf(shinfo), 0x100 | 0x0);
largeIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon);
string[] ss = f.Split(new char[] { '\\' });
largeImageList.Images.Add(ss[ss.Length - 1], largeIcon);
listView1.Items.Add(ss[ss.Length - 1], ss[ss.Length - 1]);
}
}
catch (Exception) { }
}
private void listView1_GetFiles(string[] files, ImageList largeImageList)
{
try
{
foreach (string f in files)
{
hImgLarge = SHGetFileInfo(f, 0, ref shinfo, Marshal.SizeOf(shinfo), 0x100 | 0x0);
largeIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon);
string[] ss = f.Split(new char[] { '\\' });
largeImageList.Images.Add(ss[ss.Length - 1], largeIcon);
listView1.Items.Add(ss[ss.Length - 1], ss[ss.Length - 1]);
}
}
catch (Exception) { }
}
private void GetItems(string path)
{
try
{
if (Directory.Exists(path))
{
ImageList largeImageList = new ImageList();
largeImageList.ColorDepth = ColorDepth.Depth32Bit;
largeImageList.ImageSize = new System.Drawing.Size(32, 32);
listView1.LargeImageList = largeImageList;
listView1.Items.Clear();
listView1_GetFolders(Directory.GetDirectories(path), largeImageList);
listView1_GetFiles(Directory.GetFiles(path), largeImageList);
}
}
catch (Exception) { }
}
}
У мене виникла проблема, коли з самого початку я вибираю якийсь диск, підвантажує все нормально, але потім, я так зрозумів, бере останню іконку і підставляє під всі папки та файли, не знаю як виправити. Заздалегідь дякую за допомогу.