Anzeigen von Foldern und Files in CListCtrl

stefan-rw

Mitglied
Hallo ...
wie kann ich in einem CListCtrl Dateien und Verzeichnisse anzeigen? Ich weis, dass es da die Methode DlgDirList gibt, Aber irgendwie komme ich mit der gar nicht klar. Rückgabewert ist 1, aber die Liste bleibt leer.

Keine Ahnung, was ich da machen soll.

Danke für eure Hilfe
 

pschilling

Erfahrenes Mitglied
Hallo,

schreibs dir doch in etwa so:

Code:
void listDirectory(CString path) {
  CFileFind ff;
  BOOL bContinue = ff.FindFile(path + "\\*");
  while( bContinue ) {
    bContinue = ff.FindNextFile();
    CString fPath = ff.GetFilePath();
    CString fName = ff.GetFileName();
    if( fName == "." || fName == ".." ) {
      continue;
    }
    UINT attrs = GetFileAttributes(fPath);
    if( (attrs&FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY ) {
      // Verzeichnis
      myListCtrl.InsertItem(0,fName);
    }
    else {
      // Datei
      myListCtrl.InsertItem(1000,fName);
    }
  }
  ff.Close();
}

Sollte dir weiterhelfen, denke ich.. Wenn du noch so Sachen wie Dateigröße und so darstellen willst schau dir die Klasse CFileStatus an..

Viel Erfolg...


Pit
 

stefan-rw

Mitglied
Hi...

Danke danke... wird mir bestimmt weiterhelfen, auch wenn ich schon über die WinApi gelöst habe. Von den beiden Klassen war mir bisher nichts bekannt. Werd sie mir mal ansehen.

Was mir jetzt noch fehlt ist die Darstellung der Systemicons... Ein manueller Vergleich der Dateierweiterung ist mir zu aufwendig, und lediglich Icons für Dateien und Directorys ist mir zu wenig und sieht weniger professionell aus. Kannst du mir da auch weiterhelfen ?

Danke

Stefan
 

MCoder

Erfahrenes Mitglied
Hallo,

schaue dir mal die API-Funktion SHGetFileInfo an. Damit bekommst du auch das der der Datei zugeordnete Icon heraus.

Gruß
MCoder
 

stefan-rw

Mitglied
Ja stimmt, abe ich habs bis jetzt noch nicht geschafft, das Icon in mein über das Studio erstellte CListCtrl einzubinden, bzw. die SystemIconList dem CListCtrl zuzuordnen oder die entsprechenden Icons in meine eigene Imagelist zu kopieren.

Vielleicht könnt ihr da ja auch helfen.


Danke
Stefan
 

MCoder

Erfahrenes Mitglied
Wenn du den Dateipfad (strFilePath) und die Imagelist (m_imageList) schon hast, sollte das doch eigentlich kein Problem mehr sein:
C++:
SHFILEINFO sfi; 
SHGetFileInfo( strFilePath,
               0,
               &sfi,
               sizeof(SHFILEINFO),
               SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES ); 

int nIndex = m_imageList.Add(sfi.hIcon); // Imagelist-Index für InsertItem
Gruß
MCoder
 

pschilling

Erfahrenes Mitglied
Hallo MCoder, hallo Stefan,

wenn du es über eine eigene Imagelist macht, muss du den Index des Images aufgrund des Typ, der Extension selbst pflegen und so.

Das willst du glaub ich nicht.

Wenn du dich um gar nix kümmern willst, mach es einfach so:

Halte dir eine Membervariable vom Typ CImageList (In meinem Bsp. m_imgList)

Beim Initialisieren deines Views oder Dialogs schreibst du folgendes:

Code:
    HIMAGELIST hSysImgList = (HIMAGELIST)SHGetFileInfo("C:\\", 0, &fi, sizeof(SHFILEINFO), SHGFI_SMALLICON|SHGFI_SYSICONINDEX ); // Liefert das Handle der System-Image-List
    m_imgList.Attach(hSysImgList); // Diese attachen wir an unser CImageList Objekt
    m_cList.SetImageList(&m_imgList, LVSIL_SMALL); // Und hängen unsere Imagelist an das Listcontrol.

Diese ImageList darfst du aber nicht verändern

Beim Einfügen eines Objektes in dein Listcontrol:
Code:
        memset(&fi,0,sizeof(SHFILEINFO));
        SHGetFileInfo(fPath, 0, &fi, sizeof(SHFILEINFO), SHGFI_SMALLICON|SHGFI_SYSICONINDEX  );
        if( (attrs&FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY ) {
            // Verzeichnis
            m_cList.InsertItem(0,fName,fi.iIcon);

So bekommst du garantiert die Icons für deine Objekte angezeigt, die auch der Explorer verwendet..

Der obige Code gilt nur für die kleinen Images... Für die grossen musst du halt SHGFI_ICON und LVSIM_NORMAL verwenden..
Schönen Gruß,

Pit
 
Zuletzt bearbeitet:

stefan-rw

Mitglied
Hallo pschilling, Hallo MCoder,

vielen Dank erstmal für eure Hilfe...

habe es schon mit pschillings Methode versucht, hat aber nie geklappt. Vieleichts tuts das ja diesmal.

Ich nehm an, fi ist ein e SHFILEINFO struktur, und cList ein CListCtrl ?

was aber ist memset

Danke und schönen Gruss

Stefan
 

stefan-rw

Mitglied
Hallo ...

habs jetzt mit folgendem Code probiert:


void CTest4Dlg::Init()
{
SHFILEINFO fi;

HIMAGELIST hSysImgList = (HIMAGELIST)SHGetFileInfo("C:\\", 0, &fi, sizeof(SHFILEINFO), SHGFI_SMALLICON|SHGFI_SYSICONINDEX ); // Liefert das Handle der System-Image-List
m_imgList.Attach(hSysImgList); // Diese attachen wir an unser CImageList Objekt
m_fileList.SetImageList(&m_imgList, LVSIL_SMALL); // Und hängen unsere Imagelist an das Listcontrol.

memset(&fi,0,sizeof(SHFILEINFO));
SHGetFileInfo("C:\\AUTOEXEC.BAT", 0, &fi, sizeof(SHFILEINFO), SHGFI_SMALLICON|SHGFI_SYSICONINDEX );
// if( (fi.dwAttributes&FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY ) {
// Verzeichnis
m_fileList.InsertItem(0,"tst",fi.iIcon);//}
}

Das Ergebnis ist nicht grad zufriedenstellend.... Abgesehen davon, das die Bezeichnung "tst" in die Liste eingetragen wird tut sich nichts.

Warum nur ?

Guss
Stefan
 

Neue Beiträge