TreeViev A ikony systemowe

0

Proszę o pomoc. Mam problem z którym mecze sie już 2 dni.
Nie wiem jak przyporządkować folderom a szczególnie plikom ikony pobrane z systemu.
Ikony udaje mi sie pobrać, tworzy sie ImageList ale dla każdego folderu i pliku wyświetlana jest ta sama ikona.
Część kodu:

            foreach (DirectoryInfo di in dir.GetDirectories())
            {
                TreeNode child = new TreeNode(di.Name);
                child.ImageIndex = 5;
                FillDirectory(child, di, level);
                hImgSmall = Win32.SHGetFileInfo(dir.FullName, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), Win32.SHGFI_ICON | Win32.SHGFI_SMALLICON);
                System.Drawing.Icon myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon);
                myImageList.Images.Add(myIcon);
                parent.Nodes.Add(child);
            }
            foreach (FileInfo fi in dir.GetFiles())
            {
                TreeNode child = new TreeNode(fi.Name);
                hImgSmall = Win32.SHGetFileInfo(fi.FullName, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), Win32.SHGFI_ICON | Win32.SHGFI_SMALLICON);
                System.Drawing.Icon myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon);
                myImageList.Images.Add(myIcon);
                parent.Nodes.Add(child);
            }

Pewnie chodzi o indeksowanie ikon ale nie mam pojęcia jak je powiązać z gałęziami drzewa.

Z góry dzięki.

0
 
      public static Icon IconFromExtension(string Extension, IconSize Size)
        {
            try
            {
                Icon TempIcon;

                //add '.' if nessesry
                if (Extension[0] != '.') Extension = '.' + Extension;

                //temp struct for getting file shell info
                SHFILEINFO TempFileInfo = new SHFILEINFO();

                SHGetFileInfo(
                    Extension,
                    0,
                    ref TempFileInfo,
                    (uint)Marshal.SizeOf(TempFileInfo),
                    SHGFI_ICON | SHGFI_USEFILEATTRIBUTES | (uint)Size);

                TempIcon = (Icon)Icon.FromHandle(TempFileInfo.hIcon);
                return GetManagedIcon(ref TempIcon);
            }
            catch (Exception e)
            {
                System.Diagnostics.Debug.WriteLine("error while trying to get icon for " + Extension + " :" + e.Message);
                return null;
            }
        }
        public static Icon GetManagedIcon(ref Icon UnmanagedIcon)
        {
            Icon ManagedIcon = (Icon)UnmanagedIcon.Clone();

            DestroyIcon(UnmanagedIcon.Handle);
            return ManagedIcon;
        }

gdzie:
const uint SHGFI_ICON = 0x100;
const uint SHGFI_USEFILEATTRIBUTES = 0x10;
jak by bylo cos nie jasne to pisz. ja takie cos robilem na listview wiec z checia pomoge

0

zapomnialem dodac struktury:

        public struct SHFILEINFO
        {
            public IntPtr hIcon;
            public IntPtr iIcon;
            public uint dwAttributes;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
            public string szDisplayName;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
            public string szTypeName;
        };
0

Mam pytanie czy jest jakaś analogia pomiędzy klasą System.IO.FileInfo (lub też inne ***info) a użyciem funkcji shella SHGetFileInfo? Czy idzie takie informacje jakie mamy po SHGetfileInfo uzuskać dzięki jakiejś wbudowanej bibliotece w .net?? Czy zawsze do takich rzeczy trzeba używać shella?? Dzięki za pomoc

1 użytkowników online, w tym zalogowanych: 0, gości: 1