2010-01-18 2 views
4

У меня есть приложение (C++ Builder 6.0), которое должно знать общее количество изображений, которые есть в определенной папке, а затем я должен их загрузить: в ImageList или в ComboBoxEx ... или любой другой элемент управления. .Как узнать и загрузить все изображения в определенной папке?

Как я могу это сделать?

Я знаю, как загрузить изображение в элементе управления или сохранить в TList или в ImageList ... но как узнать, сколько файлов файлов есть в каталоге и как загружать каждое изображение в Это??

Прошу прощения за мой английский.

+0

Связанный вопрос: http: // stackoverflow.com/вопросы/2084809/windows-thumbnail-frame-view – stukelly

ответ

1

Я сделал что-то подобное вчера с C++, используя библиотеку boost::filesystem. Однако, если вы еще не используете boost, я бы настоятельно рекомендовал вам вместо этого использовать библиотеки Windows. Это был мой код, хотя в случае, если вы заинтересованы:

#include <algorithm> 
#include <boost/filesystem.hpp> 
#include <set> 

namespace fs = boost::filesystem; 

typedef std::vector<fs::path> PathVector; 

std::auto_ptr<PathVector> ImagesInFolder(const fs::path& folderPath) { 
    std::set<std::string> targetExtensions; 
    targetExtensions.insert(".JPG"); 
    targetExtensions.insert(".BMP"); 
    targetExtensions.insert(".GIF"); 
    targetExtensions.insert(".PNG"); 

    std::auto_ptr<PathVector> paths(new PathVector()); 

    fs::directory_iterator end; 
    for(fs::directory_iterator iter(folderPath); iter != end; ++iter) { 
     if(!fs::is_regular_file(iter->status())) { continue; } 

     std::string extension = iter->path().extension(); 
     std::transform(extension.begin(), extension.end(), extension.begin(), ::toupper); 
     if(targetExtensions.find(extension) == targetExtensions.end()) { continue; } 

     paths->push_back(iter->path()); 
    } 

    return paths; 
} 

Это не отвечает на часть вашего вопроса о том, как на самом деле положить пути в ListBox, хотя.

1

Использование функций Win32 FindFirstFile и FindNextFile ...?

0

Нет никакого практического способа идентифицировать каждый изображение в произвольной папке. Почти все, что вы не можете идентифицировать как нечто иное, может быть своего рода изображением. Опять же, используя стеганографию, даже то, что вы, , может определить, как что-то еще может быть (или содержать) хотя бы часть изображения.

Реально, вы хотите выбрать набор форматов, которые хотите поддержать, и написать код, который знает о них. Для целого ряда целей, полдюжины форматов или около того вполне адекватны, хотя точная половина десятка, которую вы выбираете, будет различаться по типу приложения - для некоторых примеров несколько программ могут использоваться как для растровой, так и для векторной графики.

Как только вы решили, что хотите, DlgDirList, вероятно, самый простой способ перечислить некоторые файлы. Если это недостаточно гибко для ваших целей, следующий очевидный выбор - FindFirstFile, FindNextFile и FindClose.

0

Чтобы получить список всех файлов в папке, ознакомьтесь с функциями FindFirst и FindNext в SysUtils.

Ниже приведен пример функции, которая показывает, как получить список файлов.

void __fastcall TForm1::GetDirList(TStrings *List, const AnsiString SearchStr) 
{ 
TSearchRec SRec; 
AnsiString TempFName; 

List->Clear(); 

// start search 
if (FindFirst(SearchStr, faAnyFile, SRec) == 0) 
{ 
    do 
    { 
    if ((SRec.Attr & faDirectory) != faDirectory) // exclude directories 
    { 
     List->Add(SRec.Name); 
    } // end if 
    } 
    while (FindNext(SRec) == 0); 

    FindClose(SRec); 
} // end if 
} 

Примеры: // получить список всех файлов в каталоге GetDirList (MyStringList, "C:. \ Изображения *");

// get list of all .bmp files in directory 
GetDirList(MyStringList, "C:\images\*.bmp"); 
0

Если вы можете перейти на более новую версию C++ Builder, взгляните на TMS AdvSmoothImageListBox, от TMS Software.

TMS AdvSmoothImageListBox

В TMS Smooth Controls are available free for C++Builder 2010 пользователи на сайте от Embarcadero.

+0

Кредит на ответ, данный vcldeveloper по этому вопросу: http://stackoverflow.com/questions/2084809/windows-thumbnail-frame-view/2084936#2084936 – stukelly

Смежные вопросы