Картинки для папок
От: Аноним  
Дата: 03.03.11 20:29
Оценка:
Здравствуйте.

Получаю картики для файлов/папок через COM интерфейс IExtractImage для items в ListView. Но есть две проблемы...
1. IExtractImage.Extract не возвращает картинку для пустой папки (выбрасывает exception).
Как получить картинку для пустой папки (желтая пиктограмка как в windows explorer)? Не обязательно через interop. Можно средствами .net. Простейший казалось бы случай , но никак не найду решение.

2. Возвращаемые картинки для папок имеют чёрный фон. Сейчас борюсь с этим так :


this.image.MakeTransparent(Color.Black);


Может есть способ их получить сразу с прозрачным фоном ?

Заранее спасибо.

08.03.11 12:56: Перенесено модератором из '.NET' — TK
Re: Картинки для папок
От: vit_as Россия  
Дата: 03.03.11 20:55
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте.


А>Получаю картики для файлов/папок через COM интерфейс IExtractImage для items в ListView. Но есть две проблемы...

А>1. IExtractImage.Extract не возвращает картинку для пустой папки (выбрасывает exception).
А>Как получить картинку для пустой папки (желтая пиктограмка как в windows explorer)? Не обязательно через interop. Можно средствами .net. Простейший казалось бы случай , но никак не найду решение.

А>2. Возвращаемые картинки для папок имеют чёрный фон. Сейчас борюсь с этим так :



А>
А>this.image.MakeTransparent(Color.Black);
А>


А>Может есть способ их получить сразу с прозрачным фоном ?


А>Заранее спасибо.


Таким вот способом беру иконки для файлов и папок.
    [StructLayout(LayoutKind.Sequential)]
    internal 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;
    };

    class Win32
    {
        public const uint SHGFI_ICON = 0x100;
        public const uint SHGFI_LARGEICON = 0x0;    // 'Large icon
        public const uint SHGFI_SMALLICON = 0x1;    // 'Small icon

        [DllImport("shell32.dll")]
        public static extern IntPtr SHGetFileInfo(string pszPath,
                                    uint dwFileAttributes,
                                    ref SHFILEINFO psfi,
                                    uint cbSizeFileInfo,
                                    uint uFlags);

        [DllImport("shell32.dll")]
        internal static extern IntPtr ExtractIcon(IntPtr hInst, string lpszExeFileName, int nIconIndex);
        [DllImport("User32.dll")]
        internal static extern int DestroyIcon(IntPtr hIcon);
       
    }
    class IconManager
    {
        internal static System.Windows.Media.Imaging.BitmapSource GetFileIcon(string fName)
        {
            SHFILEINFO shinfo = new SHFILEINFO();
            IntPtr hImgSmall = Win32.SHGetFileInfo(fName, 0, ref shinfo,
                                  (uint)Marshal.SizeOf(shinfo),
                                   Win32.SHGFI_ICON |
                                   Win32.SHGFI_SMALLICON);
            IntPtr dd = shinfo.hIcon;
            System.Windows.Media.Imaging.BitmapSource b = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(dd, Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
           
            return b;
        }
    }
Re: Картинки для папок
От: vitz  
Дата: 04.03.11 09:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте.


А>Получаю картики для файлов/папок через COM интерфейс IExtractImage для items в ListView. Но есть две проблемы...

эм..., мож пригодится WindowsAPICodePack
Re[2]: Картинки для папок
От: Аноним  
Дата: 04.03.11 09:49
Оценка:
System.Windows.Media.Imaging.BitmapSource это PresentationCore.dll (Framework не ниже 3.5). У меня приложение под Framework 2.0. Использовать SHGetFileInfo пробовал:


public static System.Drawing.Icon GetFolderIcon(IconSize size, FolderType folderType)
        {
            ...

            // Get the folder icon
            Shell32.SHFILEINFO shfi = new Shell32.SHFILEINFO();
            Shell32.SHGetFileInfo(null,
                Shell32.FILE_ATTRIBUTE_DIRECTORY,
                ref shfi,
                (uint)System.Runtime.InteropServices.Marshal.SizeOf(shfi),
                flags);

            System.Drawing.Icon.FromHandle(shfi.hIcon);    // Load the icon from an HICON handle

            // Now clone the icon, so that it can be successfully stored in an ImageList
            System.Drawing.Icon icon = (System.Drawing.Icon)System.Drawing.Icon.FromHandle(shfi.hIcon).Clone();

            User32.DestroyIcon(shfi.hIcon);        // Cleanup
            return icon;
        }
    }


Но для папок такой код возвращает неправильную картинку (показал бы ,но не знаю как добавить картинку). Причём для всех одинаковую.
Re[2]: Картинки для папок
От: SAVe  
Дата: 04.03.11 09:57
Оценка:
Пробовал. Отлично работает на Win 7. Но требует Framework не ниже 3.5 и не работает на Win XP. А мне надо решение под Framework 2.0 и что бы на Win XP работало.
Re[3]: Картинки для папок
От: Аноним  
Дата: 05.03.11 11:53
Оценка:
Здравствуйте, Аноним, Вы писали:

всё там хорошо работает — посмотрите параметры SHFILEINFO
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.