Функция SHGetFileInfo не отражает и не меняет размер пиктограммы папок

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Orakul, 6 May 2015.

  1. Orakul

    Orakul New Member

    Joined:
    24 Jun 2013
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    Здравствуйте форумчане!!!
    С помощью компонента Listview вывожу файлы из нужной пользователю каталога-директории Функция SHGetFileInfo корректно отображает пиктограммы файлов
    Listview реагирует увеличением или уменьшением рамкой поля в котором отображается пиктограмма файла или папки , но сама пиктограмма размер не меняет. Изначально в 17-й стр., ниже приведенного кода, вторым параметром функции - FindFirst() стоял флаг faAnyFile, но так как возникла проблема с отображением иконок - пиктограмм ПАПОК добавил вторую функцию - FindFirst() на поиск только папок где жестко задал индекс иконки ПАПКИ (методом тыка :help: нашел) и это смущает , ведь описании функции - SHGetFileInfo написано что она получает доступ к спискам пиктрограмм Windows но почему же тогда она не выводит индекс иконки ПАПКИ?


    Code:
    void __fastcall Twindowsnetrepository::ExplorerDir(UnicodeString *DirPatch)
        {
            TSHFileInfo SFI = {0};
            TSearchRec filestruct;
            TIcon *icon = new TIcon;
            TListItem *newitem;
    
            ListView1->ViewStyle = vsIcon;
            ListView1->LargeImages = new TImageList(16,16);
            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_SELECTED | SHGFI_OPENICON | SHGFI_LARGEICON | SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES + SHGFI_ICON );
    
            //Запрашиваем большие иконки
            *DirPatch = *DirPatch + "*.*";
              int res = FindFirst(*DirPatch,faHidden | faArchive | faSysFile + faVolumeID,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(DateTimeToStr(FileDateToDateTime(filestruct.Time)));
    
                  SHGetFileInfo((*DirPatch + filestruct.Name).c_str(), SFGAO_SHARE,  &SFI, sizeof(SFI),SHGFI_SELECTED | SHGFI_OPENICON | SHGFI_ICON | SHGFI_SYSICONINDEX | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES);
                  newitem->ImageIndex = SFI.iIcon;
                  newitem->OverlayIndex = 1;
                }
                res = FindNext(filestruct);
            }
    
            FindClose(filestruct);
    
            // поиск и вывод  папок
            res = FindFirst(*DirPatch,faDirectory,filestruct);
            while (res == 0)
                {
                    if ((filestruct.Name != ".") && (filestruct.Name != "..") && ((filestruct.Attr & faDirectory) !=0))
                    {
                        newitem = ListView1->Items->Add();
                        newitem->Caption = filestruct.Name;
                                            newitem->ImageIndex = SFI.iIcon;
                        newitem->ImageIndex = 1;
                        newitem->SubItems->Add("");
                        newitem->SubItems->Add(DateTimeToStr(FileDateToDateTime(filestruct.Time)));
                        newitem->OverlayIndex =0 ;
                    }
                 res = FindNext(filestruct);
                }
           FindClose(filestruct);
        }