Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Рогатые иконки


Автор: addnr 26.8.2007, 22:38
Сделал ListView со списком файлов, но вот иконки в этом списке рогато выглядят, подскажите как можно улучшить их вид?

http://rapidshare.com/files/51449997/Example.zip

Автор: shurik247 27.8.2007, 03:58
Занимался както этим, только на WinAPI, надо получать их из системного листа, это должно помочь:
Код

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

            // Need to add size check, although errors generated at present!
            uint flags = Shell32.SHGFI_ICON | Shell32.SHGFI_USEFILEATTRIBUTES;

            if (FolderType.Open == folderType)
            {
                flags += Shell32.SHGFI_OPENICON;
            }
            
            if (IconSize.Small == size)
            {
                flags += Shell32.SHGFI_SMALLICON;
            } 
            else 
            {
                flags += Shell32.SHGFI_LARGEICON;
            }

            flags += Shell32.SHGFI_SYSICONINDEX;

            Shell32.SHFILEINFO FI = new Shell32.SHFILEINFO();

            // System listView
            IntPtr hSysLV = Shell32.SHGetFileInfo("C:\\", 0, ref FI,
                (uint) System.Runtime.InteropServices.Marshal.SizeOf(FI),
                flags);

            
            // 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 );


            IntPtr hIcon = CommCtl32.ImageList_GetIcon(hSysLV, shfi.iIcon, flags);

            System.Drawing.Icon.FromHandle(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;
        }    
    }
public class CommCtl32
    {
        [DllImport("comctl32.dll")]
        public static extern IntPtr ImageList_GetIcon(IntPtr himl, int i, uint flags);
    }


Добавлено через 1 минуту и 39 секунд
Да, в ImageList_GetIcon флаги другие их надо в вин айпях смотреть smile

Автор: altarvic 27.8.2007, 06:46
Я тоже когда-то такое делал. Лучше всего назначить ListView системный ImageList, один раз. Не надо будет извлекать, добавлять иконки. Ставим просто индекс иконки в системной листе и все.

Автор: addnr 27.8.2007, 17:50
shurik247
что то твой код не хочет компилиться, даже после редактирования.
не можешь помоч?

Автор: shurik247 29.8.2007, 03:06
Енто не мой код, а твой я прсто добавил в твой файл, который ты написал пару строк:
Код

//--------------------------------------------------------------------------------
            // Что бы получить индекс иконки в системном листе
            flags += Shell32.SHGFI_SYSICONINDEX;

            // Получаем хандле системного листа с иконками
            IntPtr hSysLV = Shell32.SHGetFileInfo("C:\\", 0, ref FI,
                (uint) System.Runtime.InteropServices.Marshal.SizeOf(FI),
                flags);

            // Получаем хандле самой иконки из системного листа
            // flags сдесь надо поменять на нормальные для этой функции (типа ILD_32 вроде, но не точно)
            IntPtr hIcon = CommCtl32.ImageList_GetIcon(hSysLV, shfi.iIcon, flags);
//---------------------------------------------------------------------------------
public class CommCtl32
    {
        //-- Здесь должны еще быть флаги для этой функции, которые можно достать из сишного h файла или еще гденить
        [DllImport("comctl32.dll")]
        public static extern IntPtr ImageList_GetIcon(IntPtr himl, int i, uint flags);
    }


И у меня все компилиться

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)