Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
 Аватар для Orakul
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171

Как отобразить ярлыки (icon) функцией SHGetFileInfo?

04.05.2015, 09:41. Показов 3459. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Знатоки подскажите как правильно вывести иконки файлов и папок в компонент ListView.
написал функцию которая обрабатывает файлы по заданному адресу на диске, в ListView
отображаются имена файлов и папок но отсутствуют ярлыки. Задайте направление , ресурс,
информацию куда и где копать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void __fastcall Twindowsnetrepository::ExplorerDir(void)
{
    TSHFileInfo SFI;
    TSearchRec filestruct;
    TIcon *icon = new TIcon;
    TListItem *newitem;
    ListView1->LargeImages = new TImageList(32,32);
    ListView1->SmallImages = new TImageList(24,24);
 
 
    //Запрашиваем большие иконки
    Dir = Dir+"*.*";
      int res = FindFirst(Dir,faAnyFile,filestruct);  
    while (!res)
    {
//Присваиваем системные иконки в ListViewl
            newitem = ListView1->Items->Add();
            newitem->Caption = filestruct.Name;
            SHGetFileInfo((Dir + filestruct.Name).c_str(), 0,  &SFI, sizeof(SFI), SHGFI_ICON | SHGFI_SYSICONINDEX | SHGFI_LARGEICON);
            icon->Handle = SFI.hIcon;
            ListView1->LargeImages->AddIcon(icon);
            SHGetFileInfo((Dir + filestruct.Name).c_str(), 0,  &SFI, sizeof(SFI), SHGFI_ICON | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
            ListView1->LargeImages->AddIcon(icon);
            newitem->ImageIndex = ListView1->LargeImages->Count-1;
            newitem->SubItems->Add(filestruct.Size);
            newitem->OverlayIndex = 1;
        //  ListView1->LargeImages->Clear();
        //  for ( int i = 0; i < windowsnetrepository->ListView1->Items->Count; i++) {windowsnetrepository->ListView1->Items->Item[i]->Delete();}
        res = FindNext(filestruct);
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.05.2015, 09:41
Ответы с готовыми решениями:

Как с помощью SHGetFileInfo получить ImageList со всеми иконками?
Помогите люди... Как с помощью SHGetFileInfo получить ImageList со всеми иконкакми зарегистрированных файлов? В исходниках везде...

Как убрать ярлыки свои ярлыки у 2-го пользователя
Люди, подскажите, как убрать свои ярлыки программ у 2 пользователя?

Использование SHGetFileInfo
c++, mfc project - не получается получить атрибуты файла с помощью ShellAPI CString Type; CString Name; SHFILEINFO shFileInfo; ...

12
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,908
Записей в блоге: 12
04.05.2015, 11:54
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void __fastcall TForm1::Button7Click(TObject *Sender)
{
    TSHFileInfo SFI = {0};
    TSearchRec filestruct;
    TIcon *icon = new TIcon;
    TListItem *newitem;
 
    ListView1->ViewStyle = vsReport;
    ListView1->SmallImages = new TImageList(16, 16);
    ListView1->SmallImages->ShareImages = true;
    ListView1->SmallImages->Handle = SHGetFileInfo(L"*.*", SFGAO_SHARE, &SFI,
        sizeof(SFI), SHGFI_SMALLICON | SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES);
 
    // Запрашиваем маленькие иконки
    Dir = Dir + "*.*";
    int res = FindFirst(Dir, faAnyFile, filestruct);
    while (!res)
    {
        newitem = ListView1->Items->Add();
        newitem->Caption = filestruct.Name;
        newitem->SubItems->Add(filestruct.Size);
 
        SHGetFileInfo((Dir + filestruct.Name).c_str(), SFGAO_SHARE, &SFI,
            sizeof(SFI), SHGFI_SMALLICON | SHGFI_SYSICONINDEX | SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES);
        newitem->ImageIndex = SFI.iIcon;
        res = FindNext(filestruct);
    }
}
Результат:
Миниатюры
Как отобразить ярлыки (icon) функцией SHGetFileInfo?  
3
 Аватар для Orakul
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171
04.05.2015, 12:38  [ТС]
Благодарю!!! Но почему то иконки отражаются не те : нет иконки "Папка" , и все иконки одинаковы под разные файлы, получается нет классификации по типу файла?
Миниатюры
Как отобразить ярлыки (icon) функцией SHGetFileInfo?  
0
 Аватар для Orakul
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171
04.05.2015, 12:53  [ТС]
Такое ощущение что функция SHGetFileInfo не смогла получить системные .ico .
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void __fastcall Twindowsnetrepository::ExplorerDir(UnicodeString *DirPatch)
{
    TSHFileInfo SFI = {0};
    TSearchRec filestruct;
    TIcon *icon = new TIcon;
    TListItem *newitem;
 
    ListView1->LargeImages = new TImageList(32,32);
    ListView1->SmallImages = new TImageList(16,16);
    ListView1->SmallImages->ShareImages = true;
    ListView1->LargeImages->ShareImages = true;
    ListView1->LargeImages->Handle = SHGetFileInfo(L"*.*", SFGAO_SHARE, &SFI, sizeof(SFI), SHGFI_SMALLICON | SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES);
    ListView1->SmallImages->Handle = SHGetFileInfo(L"*.*", SFGAO_SHARE, &SFI, sizeof(SFI), SHGFI_SMALLICON | SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES);
 
    //Запрашиваем большие иконки
    *DirPatch = *DirPatch + "*.*";
      int res = FindFirst(*DirPatch,faAnyFile,filestruct);
    while (!res)
    {
        if ((filestruct.Name !="." ) && (filestruct.Name != ".."))
        {
//Присваиваем системные иконки в ListViewl
          newitem = ListView1->Items->Add();
          newitem->Caption = filestruct.Name;
          newitem->SubItems->Add(filestruct.Size);
 
          SHGetFileInfo((*DirPatch + filestruct.Name).c_str(), SFGAO_SHARE,  &SFI, sizeof(SFI), SHGFI_ICON | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
          newitem->ImageIndex = SFI.iIcon;
          newitem->OverlayIndex = 1;
        }
        res = FindNext(filestruct);
    }
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,908
Записей в блоге: 12
04.05.2015, 12:56
Ты два раза получаешь маленькие иконки, в 12 строке SHGFI_SMALLICON замени на SHGFI_LARGEICON, к тому же в режиме отображения vsIcon нужно получать большие иконки, а ты в 27-ой строке получаешь маленькие. Там тоже тогда менять надо...
1
 Аватар для Orakul
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171
04.05.2015, 13:01  [ТС]
Вот эту строку закомментировал :
C++
1
ListView1->SmallImages->Handle = SHGetFileInfo(L"*.*", SFGAO_SHARE, &SFI, sizeof(SFI), SHGFI_SMALLICON | SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES);
Все равно выводит ярлыки как выше скрине.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,908
Записей в блоге: 12
04.05.2015, 13:03
Лучший ответ Сообщение было отмечено Orakul как решение

Решение

Закомментировал - это прекрасно но надо чтобы в LargeImages были именно БОЛЬШИЕ иконки, предыдущую строку поменял? До конца мое предыдущее сообщение прочел?
1
 Аватар для Orakul
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171
04.05.2015, 13:34  [ТС]
ДА, ответ прочитал код привел в как сказал :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
void __fastcall Twindowsnetrepository::ExplorerDir(UnicodeString *DirPatch)
{
    TSHFileInfo SFI = {0};
    TSearchRec filestruct;
    TIcon *icon = new TIcon;
    TListItem *newitem;
 
//  ListView1->Items->Item->StateIndex = 1;
    ListView1->ViewStyle = vsIcon;
    ListView1->LargeImages = new TImageList(32,32);
    ListView1->SmallImages = new TImageList(16,16);
    ListView1->SmallImages->ShareImages = true;
    ListView1->LargeImages->ShareImages = true;
    ListView1->LargeImages->Handle = SHGetFileInfo(L"*.*", SFGAO_SHARE, &SFI, sizeof(SFI), SHGFI_LARGEICON | SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES);
  //    ListView1->SmallImages->Handle = SHGetFileInfo(L"*.*", SFGAO_SHARE, &SFI, sizeof(SFI), SHGFI_SMALLICON | SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES);
 
    //Запрашиваем большие иконки
    *DirPatch = *DirPatch + "*.*";
      int res = FindFirst(*DirPatch,faAnyFile,filestruct);
    while (!res)
    {
        if ((filestruct.Name !="." ) && (filestruct.Name != ".."))
        {
//Присваиваем системные иконки в ListViewl
          newitem = ListView1->Items->Add();
          newitem->Caption = filestruct.Name;
          newitem->SubItems->Add(filestruct.Size);
          newitem->SubItems->Add(filestruct.Time);
 
         // SHGetFileInfo((*DirPatch + filestruct.Name).c_str(), SFGAO_SHARE,  &SFI, sizeof(SFI), SHGFI_ICON | SHGFI_SYSICONINDEX | SHGFI_LARGEICON);
          newitem->ImageIndex = SFI.iIcon;
          newitem->OverlayIndex = 1;
        }
        res = FindNext(filestruct);
    }
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,908
Записей в блоге: 12
04.05.2015, 13:42
Издеваешься? В 30 строке у тебя происходит то, что тебе нужно, ты ее вышвырнул, и теперь жалуешься, что она НЕ РАБОТАЕТ? Раскомментировал строку, сделал так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    TSHFileInfo SFI = {0};
    TSearchRec filestruct;
    TIcon *icon = new TIcon;
    TListItem *newitem;
    ListView1->ViewStyle = vsIcon;
 
    // ListView1->Items->Item->StateIndex = 1;
    ListView1->ViewStyle = vsIcon;
    ListView1->LargeImages = new TImageList(32, 32);
    ListView1->SmallImages = new TImageList(16, 16);
    ListView1->SmallImages->ShareImages = true;
    ListView1->LargeImages->ShareImages = true;
    ListView1->LargeImages->Handle = SHGetFileInfo(L"*.*", SFGAO_SHARE, &SFI,
        sizeof(SFI),
        SHGFI_LARGEICON | SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES);
    // ListView1->SmallImages->Handle = SHGetFileInfo(L"*.*", SFGAO_SHARE, &SFI, sizeof(SFI), SHGFI_SMALLICON | SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES);
 
    // Запрашиваем большие иконки
    Dir = Dir + "*.*";
    int res = FindFirst(Dir, faAnyFile, filestruct);
    while (!res)
    {
        if ((filestruct.Name != ".") && (filestruct.Name != ".."))
        {
            // Присваиваем системные иконки в ListViewl
            newitem = ListView1->Items->Add();
            newitem->Caption = filestruct.Name;
            newitem->SubItems->Add(filestruct.Size);
            newitem->SubItems->Add(filestruct.Time);
 
            SHGetFileInfo((Dir + filestruct.Name).c_str(), SFGAO_SHARE, &SFI,
                sizeof(SFI),
                SHGFI_SMALLICON | SHGFI_SYSICONINDEX | SHGFI_TYPENAME |
                SHGFI_USEFILEATTRIBUTES);
            newitem->ImageIndex = SFI.iIcon;
            newitem->OverlayIndex = 1;
        }
        res = FindNext(filestruct);
    }
получил результат:



Все работает. Дальнейшие твои закомментирования рабочего кода и возникшие в связи с этим новые претензии мне НЕ ИНТЕРЕСНЫ. От темы отписываюсь.
1
 Аватар для Orakul
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171
04.05.2015, 14:20  [ТС]
Извиняюсь за свою не внимательность , но дело не в строке. Создал новое приложение кинул button и listview добавил Ваш код в обработчик button результат тот же как на выше приведенном скрине :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    UnicodeString Dir;
    SelectDirectory(Dir,TSelectDirOpts() << sdAllowCreate <<sdPerformCreate <<sdPrompt,0);
        if (Dir[Dir.Length()] != '\\')
            Dir = Dir + "\\";
            ListView1->Items->Clear();
             TSHFileInfo SFI = {0};
    TSearchRec filestruct;
    TIcon *icon = new TIcon;
    TListItem *newitem;
 
    ListView1->ViewStyle = vsIcon;
    ListView1->SmallImages = new TImageList(16, 16);
    ListView1->SmallImages->ShareImages = true;
    ListView1->SmallImages->Handle = SHGetFileInfo(L"*.*", SFGAO_SHARE, &SFI,
        sizeof(SFI), SHGFI_SMALLICON | SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES);
 
    // Запрашиваем маленькие иконки
    Dir = Dir + "*.*";
    int res = FindFirst(Dir, faAnyFile, filestruct);
    while (!res)
    {
        newitem = ListView1->Items->Add();
        newitem->Caption = filestruct.Name;
        newitem->SubItems->Add(filestruct.Size);
 
        SHGetFileInfo((Dir + filestruct.Name).c_str(), SFGAO_SHARE, &SFI,
            sizeof(SFI), SHGFI_SMALLICON | SHGFI_SYSICONINDEX | SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES);
        newitem->ImageIndex = SFI.iIcon;
        res = FindNext(filestruct);
    }
}
Даже ярлыков ни каких не выводит.
0
 Аватар для Orakul
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171
04.05.2015, 14:22  [ТС]
Вот скрин :
Миниатюры
Как отобразить ярлыки (icon) функцией SHGetFileInfo?  
0
 Аватар для Orakul
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171
04.05.2015, 14:57  [ТС]
В главной форме все работает как надо а вот в модальной нет ассоциации ярлыков. Нет вообще ярлыков.
0
8 / 6 / 3
Регистрация: 02.04.2018
Сообщений: 247
18.11.2020, 23:28
volvo, А что дописать чтобы еще иконки папок и еще другие типы файлов показывало?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.11.2020, 23:28
Помогаю со студенческими работами здесь

Как создать Tray Icon
Подскажите пожалуйста как добавить tray icon с парочкой фукнций для Win Form Application?

Как правильно разместить icon
И еще раз, доброго! Подскажыте как можно разместить иконку в input так, чтоб она находилась в левой его части... и при этом текст...

Вирус заменил ярлыки программ на ярлыки *bat файлов
Добрый день! Проблема следующая. После скачивания и запуска *exe файла, ярлыки таких программ, как Opera, Internet Explorer и некоторых игр...

Как сделать анимированный icon в трее
Привет, хочу сделать анимированный notifyIcon1 с помощью таймера. Как я понимаю, для этого нужно использовать &quot;imageList&quot;....

Как запихнуть вместо TTray Icon Gauge?
Как запихнуть вместо TTray Icon Gauge?(Чтобы когда прога сворачивалась в трей, то Tray Icon Показывал сосотяние батареи с помощью...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Номеклатура. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru