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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить индекс иконки 
:(
    Опции темы
N1ko
Дата 6.11.2009, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ребят, провозился с данной проблемой уже 5 дней. Потерял уже какую либо надежду на получение желанного результата. КТО НИБУТЬ, ПОМОГИТЕ ПЛЗ...Вот проблема...
Я вытаскиваю иконки из файла или папки при помощи WinApi из Shell32.dll посредством функции SHGetFileInfo и вставляю иконки в ImageList(C#). Собственно интересует как достать индекс(порядковый номер) иконки в системном ImageList, дабы сверять присутствует ли таковая в ImageList? Или предложите какой нить другой вариант как определить, вставлял ли я иконку уже в созданный мной ImageList или нет. А если вставлял то обратиться по такому то индексу в ImageList. Если есть возможность, напишите код...

Вот один из многих вариантов кода, который также успешно не работает должным образом, как и другие

Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Windows.Forms;
namespace IconObtainer
{
    class IconReceiver
    {
#region Variable List
        public const uint SHGFI_ICONLOCATION = 0x000001000; 
        private const uint SHGFI_ICON = 0x100;
        public const uint SHGFI_SYSICONINDEX = 0x000004000;     // get system icon index
        private const uint SHGFI_SMALLICON = 0x1;
        public SHFILEINFO IconContainer;
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        public struct SHFILEINFO
        {
            public IntPtr hIcon;
            public int iIcon;
            public uint dwAttributes;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
            public string szDisplayName;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
            public string szTypeName;
        };

#endregion

        [DllImport("shell32.dll", CharSet = CharSet.Auto)]
        private static extern void SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbFileInfo, uint uFlags);
        public int GetIcon(string FilePath)
        {
            IconContainer = new SHFILEINFO();
            SHGetFileInfo(FilePath, 0, ref IconContainer, (uint)Marshal.SizeOf(IconContainer), SHGFI_ICONLOCATION);
           // Icon CurIcon = (Icon)Icon.FromHandle(IconContainer.hIcon);
            MessageBox.Show(IconContainer.iIcon.ToString());
            return IconContainer.iIcon;//Постоянно выдаёт  0 3 или 8 в зависимости от путя к файлу, который я указываю . Больше ничего...
        }
    }
}
 

Это сообщение отредактировал(а) N1ko - 6.11.2009, 15:31
PM MAIL ICQ   Вверх
N1ko
Дата 10.11.2009, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Что вообще никто не знает как это сделать? (((
PM MAIL ICQ   Вверх
Lunatic2009
Дата 11.11.2009, 06:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 1.7.2009

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



Все, что пришло в голову - сделать так:

Код

Icon ico = Icon.FromHandle(shinfo.hIcon);
int imgIndex = imageList1.Images.IndexOfKey(openFileDialog1.FileName);

if (imgIndex != -1)
{
     listView1.Items.Add(openFileDialog1.FileName, imgIndex);
}
else
{
     imageList1.Images.Add(openFileDialog1.FileName, ico);
     listView1.Items.Add(openFileDialog1.FileName, imageList1.Images.Count - 1);
}


Это сообщение отредактировал(а) Lunatic2009 - 11.11.2009, 06:07
PM   Вверх
N1ko
Дата 15.11.2009, 01:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вся проблема в том, что ты здесь добавляешь в ImageList путь к файлу, мне нужно передать в него иконку данного файла. То есть в твоём случае ты проверяешь в листе наличие иконки файла по заданому пути, а мне нужно проверять наличие иконки определённого вида файла. То есть исходя из написаного кода в ImageList может находиться много пунктов, которые указывают на папку. Ты немного неправильно понял проблемы. 



Это сообщение отредактировал(а) N1ko - 20.11.2009, 15:09
PM MAIL ICQ   Вверх
N1ko
Дата 20.11.2009, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Можно ли определить адрес на жёстком диске, по кторому находится иконка в shell.dll. то есть таким образом я смог бы сравнивать иконки, проверяя не совпадают ли их адреса. Прихожу к таким крайностям, поскольку никак не могу решить выше описаную проблему, разве что только попиксельным сравнением каждой мконки.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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