Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Folder Browser с CheckBox 
:(
    Опции темы
N1ko
Дата 3.10.2009, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 383
Регистрация: 30.12.2007
Где: Киев

Репутация: нет
Всего: нет



Мне нужен Folder Browser, только такой, что бы перед его всеми узлами были были CheckBox. Можно ли этого как то достич? Как в TreeView когда ставишь свойство CheckBoxes = true

Это сообщение отредактировал(а) N1ko - 3.10.2009, 16:10
PM MAIL ICQ   Вверх
mr.DUDA
Дата 4.10.2009, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Цитата(N1ko @  3.10.2009,  16:08 Найти цитируемый пост)
Как в TreeView когда ставишь свойство CheckBoxes = true

Написать свой, на основе TreeView...

Добавлено через 3 минуты и 16 секунд
... или купить вот этот  smile  


--------------------
user posted image
PM MAIL WWW   Вверх
N1ko
Дата 4.10.2009, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 383
Регистрация: 30.12.2007
Где: Киев

Репутация: нет
Всего: нет



Тогда возникает следующий вопрос.\При помощи каких средств? Как потом это встроить в Visual Studio? И насколько єто трудоёмкий процесс? 
PM MAIL ICQ   Вверх
mr.DUDA
Дата 4.10.2009, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Цитата(N1ko @  4.10.2009,  13:22 Найти цитируемый пост)
При помощи каких средств?

Создаём новую форму, вытягиваем на неё TreeView, настраиваем внешний вид, добавляем обработчик события разворачивания узлов, в нём заполняем дерево именами директорий под развёрнутым узлом (или корневых директорий или дисков, для корневого узла). Иконки доставать из shell-а.

Цитата(N1ko @  4.10.2009,  13:22 Найти цитируемый пост)
И насколько єто трудоёмкий процесс? 

Зависит от опыта в WinForms и прямоты рук, а так конечно довольно трудоёмкий процесс  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
N1ko
Дата 4.10.2009, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 383
Регистрация: 30.12.2007
Где: Киев

Репутация: нет
Всего: нет



А вот такой вопрос. Как мне вставить в TreeView список всех папок и подпапок. Это крнечно можно сделать при помощи рекурсии, но мне кажется что такой проект будет очень долго компилится, поскольку машине понадобиться много времени что бы прочесать все папки системы и забить их в ТрииВьюв. Есть ли какой нить другой способ построить дерево?
PM MAIL ICQ   Вверх
mr.DUDA
Дата 4.10.2009, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Цитата(N1ko @  4.10.2009,  14:44 Найти цитируемый пост)
но мне кажется что такой проект будет очень долго компилится, поскольку машине понадобиться много времени что бы прочесать все папки системы и забить их в ТрииВьюв

Это как же интересно время компиляции зависит от того какие папки в тривью будут показаны во время выполнения программы ?... smile 



--------------------
user posted image
PM MAIL WWW   Вверх
N1ko
Дата 4.10.2009, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 383
Регистрация: 30.12.2007
Где: Киев

Репутация: нет
Всего: нет



Я имел ввиду, что для того что бы дерево отображало список папок, нужно юзать метод GetDirectories, получать их имена и вставлять в TreeView. То есть вся эта процедура займёт определённое время. И я думаю достаточно долгое время... По этому я и спрашиваю как лучше сделать. Может сканировать заданую папку во время развёртывания дерева, или как то так.
PM MAIL ICQ   Вверх
mr.DUDA
Дата 4.10.2009, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Цитата(N1ko @  4.10.2009,  20:06 Найти цитируемый пост)
Может сканировать заданую папку во время развёртывания дерева, или как то так.

угу:

Цитата(mr.DUDA @  4.10.2009,  13:47 Найти цитируемый пост)
добавляем обработчик события разворачивания узлов, в нём заполняем дерево именами директорий под развёрнутым узлом





--------------------
user posted image
PM MAIL WWW   Вверх
N1ko
Дата 7.10.2009, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 383
Регистрация: 30.12.2007
Где: Киев

Репутация: нет
Всего: нет



А можно ли как то выдирать иконки папок? Существует ли метод для папок , схожий с методом для файлов Icon.ExtractAssociatedIcon(filepath). Проблема состоит в том, что для логических дисков или для стандартной папки "Музыка","Рисунки" совсем другая иконка, чем для папок. Да и в случае, если пользователь любит красивый внешний вид, то он может заменить стандартные папки другими иконками посредством какого нить ПО. Можно ли как то вытащить .ico для папок?

Это сообщение отредактировал(а) N1ko - 7.10.2009, 23:05
PM MAIL ICQ   Вверх
mr.DUDA
Дата 8.10.2009, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Код
using System;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.IO;
using System.Reflection;

namespace ShellIcons
{
    /// <summary>
    /// Helper class to get folder, file and computer icons.
    /// </summary>
    public class ShellIcons
    {
        #region constructor

        /// <summary>
        /// Hidden constructor
        /// </summary>
        internal ShellIcons()
        {
        }

        #endregion

        #region private fields

        Dictionary<string, Icon> _driveIcons = new Dictionary<string, Icon>();
        Dictionary<string, Icon> _fileTypeSmallIcons = new Dictionary<string, Icon>();
        Dictionary<string, Bitmap> _fileTypeSmallBitmaps = new Dictionary<string, Bitmap>();
        Dictionary<string, Icon> _fileTypeLargeIcons = new Dictionary<string, Icon>();

        #endregion

        #region Singleton implementation

        static ShellIcons _instance;
        /// <summary>
        /// Returns single instance of this class.
        /// </summary>
        public static ShellIcons Instance
        {
            get
            {
                if (_instance == null)
                    _instance = new ShellIcons();
                return _instance;
            }
        }

        #endregion


        // public properties & methods

        #region GetDriveIcon() (+1 overload)

        /// <summary>
        /// Returns the icon of specific drive.
        /// </summary>
        /// <param name="driveName">Drive name</param>
        /// <param name="refresh">If false, cached icon will be used when possible</param>
        public Icon GetDriveIcon(string driveName, bool refresh)
        {
            Icon ret = null;
            string key = driveName;
            if (!key.EndsWith(Path.DirectorySeparatorChar.ToString()))
                key += Path.DirectorySeparatorChar;

            _driveIcons.TryGetValue(key, out ret);
            if (ret != null)
            {
                if (refresh)
                {
                    ret.Dispose();
                    _driveIcons.Remove(key);
                }
                else return ret;
            }

            uint flags = Shell32.SHGFI_ICON | Shell32.SHGFI_USEFILEATTRIBUTES | Shell32.SHGFI_SMALLICON;
            Shell32.SHFILEINFO shfi = new Shell32.SHFILEINFO();
            Shell32.SHGetFileInfo(key, Shell32.FILE_ATTRIBUTE_NORMAL, ref shfi, (uint)System.Runtime.InteropServices.Marshal.SizeOf(shfi), flags);
            ret = (Icon)Icon.FromHandle(shfi.hIcon).Clone();
            User32.DestroyIcon(shfi.hIcon);

            _driveIcons[key] = ret;
            return ret;
        }

        /// <summary>
        /// Returns the icon of specific drive.
        /// </summary>
        /// <param name="driveInfo">Drive info</param>
        /// <param name="refresh">If false, cached icon will be used when possible</param>
        public Icon GetDriveIcon(DriveInfo driveInfo, bool refresh)
        {
            return GetDriveIcon(driveInfo.Name, refresh);
        }

        #endregion

        #region GetFileTypeIcon()

        /// <summary>
        /// Returns icon for particular file type.
        /// </summary>
        /// <param name="filePath">Path to the file (absolute or relative)</param>
        /// <param name="largeIcon">If false, small icon (16x16) will be returned, otherwise large (32x32) icon will be returned</param>
        /// <returns>icon for files of given type (extension), or null</returns>
        public Icon GetFileTypeIcon(string filePath, bool largeIcon)
        {
            Icon ret = null;
            Dictionary<string, Icon> cache = largeIcon ? _fileTypeLargeIcons : _fileTypeSmallIcons;
            if (filePath == null || filePath.Length == 0) return ret;

            string key = Path.GetExtension(filePath);
            bool isNonCacheable = (string.Compare(key, ".ico", true) == 0)
                || (string.Compare(key, ".lnk", true) == 0)
                || (string.Compare(key, ".pif", true) == 0)
                || (string.Compare(key, ".exe", true) == 0);

            // try use cache
            if (!isNonCacheable)
            {
                // use cached icons of files (except of .ico files)
                cache.TryGetValue(key, out ret);
                if (ret != null) return ret;
            }

            uint flags = Shell32.SHGFI_ICON | Shell32.SHGFI_USEFILEATTRIBUTES | (largeIcon ? Shell32.SHGFI_LARGEICON : Shell32.SHGFI_SMALLICON);
            Shell32.SHFILEINFO shfi = new Shell32.SHFILEINFO();
            Shell32.SHGetFileInfo(filePath, Shell32.FILE_ATTRIBUTE_NORMAL, ref shfi, (uint)System.Runtime.InteropServices.Marshal.SizeOf(shfi), flags);
            ret = (Icon)Icon.FromHandle(shfi.hIcon).Clone();
            User32.DestroyIcon(shfi.hIcon);

            if(!isNonCacheable)
                cache[key] = ret;
            return ret;
        }

        #endregion

        #region GetFileTypeBitmap()

        /// <summary>
        /// Returns bitmap for particular file type.
        /// </summary>
        /// <param name="filePath">Path to the file (absolute or relative)</param>
        /// <param name="largeIcon">If false, small icon (16x16) will be returned, otherwise large (32x32) icon will be returned</param>
        /// <returns>icon for files of given type (extension), or null</returns>
        public Bitmap GetFileTypeBitmap(string filePath, bool largeIcon)
        {
            Bitmap ret = null;

            string key = Path.GetExtension(filePath) + (largeIcon ? "_large" : string.Empty);
            bool isNonCacheable = (string.Compare(key, ".ico", true) == 0)
                || (string.Compare(key, ".lnk", true) == 0)
                || (string.Compare(key, ".pif", true) == 0)
                || (string.Compare(key, ".exe", true) == 0);

            // try use cache
            if (!isNonCacheable)
            {
                if (_fileTypeSmallBitmaps.TryGetValue(key, out ret))
                    return ret;
            }

            ret = GetFileTypeIcon(filePath, largeIcon).ToBitmap();
            
            if(!isNonCacheable)
                _fileTypeSmallBitmaps[key] = ret;

            return ret;
        }

        #endregion

        #region Shell wrapper classes

        /// <summary>
        /// Wraps necessary Shell32.dll structures and functions required to retrieve Icon Handles using SHGetFileInfo. Code
        /// courtesy of MSDN Cold Rooster Consulting case study.
        /// </summary>
        /// 
        public class Shell32
        {
            // This code has been left largely untouched from that in the CRC example.

            public const int MAX_PATH = 256;
            [StructLayout(LayoutKind.Sequential)]
            public struct SHITEMID
            {
                public ushort cb;
                [MarshalAs(UnmanagedType.LPArray)]
                public byte[] abID;
            }

            [StructLayout(LayoutKind.Sequential)]
            public struct ITEMIDLIST
            {
                public SHITEMID mkid;
            }

            [StructLayout(LayoutKind.Sequential)]
            public struct SHFILEINFO
            {
                public const int NAMESIZE = 80;
                public IntPtr hIcon;
                public int iIcon;
                public uint dwAttributes;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)]
                public string szDisplayName;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = NAMESIZE)]
                public string szTypeName;
            };

            public const uint SHGFI_ICON = 0x000000100;     // get icon
            public const uint SHGFI_DISPLAYNAME = 0x000000200;     // get display name
            public const uint SHGFI_TYPENAME = 0x000000400;     // get type name
            public const uint SHGFI_ATTRIBUTES = 0x000000800;     // get attributes
            public const uint SHGFI_ICONLOCATION = 0x000001000;     // get icon location
            public const uint SHGFI_EXETYPE = 0x000002000;     // return exe type
            public const uint SHGFI_SYSICONINDEX = 0x000004000;     // get system icon index
            public const uint SHGFI_LINKOVERLAY = 0x000008000;     // put a link overlay on icon
            public const uint SHGFI_SELECTED = 0x000010000;     // show icon in selected state
            public const uint SHGFI_ATTR_SPECIFIED = 0x000020000;     // get only specified attributes
            public const uint SHGFI_LARGEICON = 0x000000000;     // get large icon
            public const uint SHGFI_SMALLICON = 0x000000001;     // get small icon
            public const uint SHGFI_OPENICON = 0x000000002;     // get open icon
            public const uint SHGFI_SHELLICONSIZE = 0x000000004;     // get shell size icon
            public const uint SHGFI_PIDL = 0x000000008;     // pszPath is a pidl
            public const uint SHGFI_USEFILEATTRIBUTES = 0x000000010;     // use passed dwFileAttribute
            public const uint SHGFI_ADDOVERLAYS = 0x000000020;     // apply the appropriate overlays
            public const uint SHGFI_OVERLAYINDEX = 0x000000040;     // Get the index of the overlay

            public const uint FILE_ATTRIBUTE_DIRECTORY = 0x00000010;
            public const uint FILE_ATTRIBUTE_NORMAL = 0x00000080;

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

        /// <summary>
        /// Wraps necessary functions imported from User32.dll. Code courtesy of MSDN Cold Rooster Consulting example.
        /// </summary>
        public class User32
        {
            /// <summary>
            /// Provides access to function required to delete handle. This method is used internally
            /// and is not required to be called separately.
            /// </summary>
            /// <param name="hIcon">Pointer to icon handle.</param>
            /// <returns>N/A</returns>
            [DllImport("User32.dll")]
            public static extern int DestroyIcon(IntPtr hIcon);
        }

        #endregion
    }
}



--------------------
user posted image
PM MAIL WWW   Вверх
N1ko
Дата 2.11.2009, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 383
Регистрация: 30.12.2007
Где: Киев

Репутация: нет
Всего: нет



А можно ли как то получить порядковый номер иконки в системе(или какой нить уникальный параметр, который позволил бы отличить эту иконку от других), дабы можно потом было сравнивать присутствует ли уже она в ImageList? 

Это сообщение отредактировал(а) N1ko - 3.11.2009, 00:25
PM MAIL ICQ   Вверх
mr.DUDA
Дата 3.11.2009, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Цитата(N1ko @  2.11.2009,  00:03 Найти цитируемый пост)
А можно ли как то получить порядковый номер иконки в системе(или какой нить уникальный параметр, который позволил бы отличить эту иконку от других), дабы можно потом было сравнивать присутствует ли уже она в ImageList?

Можно сделать Dictionary<int, Icon> и вносить туда иконки, проверять на существование перед созданием новой.


--------------------
user posted image
PM MAIL WWW   Вверх
N1ko
Дата 3.11.2009, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 383
Регистрация: 30.12.2007
Где: Киев

Репутация: нет
Всего: нет



Сам алгоритм я понимаю, как сделать. НО меня больше интересует как достать <int иконки(составяющую Dictionary) ?  Ведь для того что бы проверить существует ли иконка в созданом мной ImageList нужно проверять по какому нибуть уникальному параметру её существование. Именно этим параметром мне кажется порядковый номер в Системном ImageList. Вопрос состоит в том как его оттудова достать??? 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0560 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.