File Explorer



  • Danke für die Tipps, ich melde mich wenn ich noch Fragen habe 🙂



  • cooky451 schrieb:

    3. Momentan sind die beiden "Hälften" des Explorers noch getrennt, ich würde das aber gerne so einrichten wie im "Original", soll heißen das sieht aus wie ein Fenster und nur eine Trennwand trennt die Hälften.

    In der MFC gibt es die Klasse CSplitterWnd, die ich für sowas nutzen würde - wie das mit reinem WinAPI aussehen würde, bin ich mir nicht sicher.


  • Mod



  • Danke für die Hilfe.
    Peinlicherweise scheitere ich gerade daran die Icons in meine ImageList zu kriegen. Mit ImageList_AddIcon hat das Bild einen schwarzen Hintergrund, wenn ich "manuell" eine Bitmap erzeuge und mit DrawIconEx drauf zeichne, wird das Bild schwarz/weiß und wenn ich mit GetIconInfo und ICONINFO.hbmColor arbeite, müsste ich das Bild wieder aufwändig mit StretchBlt skalieren. Gibt es denn da keine vernünftige Lösung 😕

    Edit:
    Ah ok - man muss ILC_COLOR32 nutzen, dann funktioniert auch ImageList_AddIcon.



  • Mir ist gerade auch Etwas peinlich: CreateImageList ist keine WinAPI-Funktion, sondern eine aus meinem Code, beim Überfliegen habe ich es nicht gemerkt:

    HIMAGELIST CreateImageList(bool large)
    {
    	HIMAGELIST imageList;
    	SHFILEINFO  sfi;
    	imageList = reinterpret_cast<HIMAGELIST>(SHGetFileInfo(TEXT("C:\\"), 
    										0,
    										&sfi,
    										sizeof(SHFILEINFO), 
    										SHGFI_SYSICONINDEX | (large ? 0 : SHGFI_SMALLICON)));
    	return imageList;
    }
    

    Damit kannst du nun die Objekte erzeugen,

    HIMAGELIST imgListLarge, imgListSmall;
    ..
    imgListSmall = CreateImageList(false);
    imgListLarge = CreateImageList(true);
    

    den Index herausfinden,

    SHFILEINFO sfi;
    if(SHGetFileInfo(TEXT("/*Pfad der Datei*/"),
    	0, &sfi, sizeof(sfi),
    	SHGFI_SYSICONINDEX | SHGFI_LARGEICON)) //oder SHGFI_SMALLICON
    {
    	iconindex=sfi.iIcon;
    }
    

    und anzeigen:

    if(iconindex!=-1)
    	ImageList_Draw(imgListLarge,
    					iconindex,
    					hdc,
    					0, // xpos
    					0, // ypos
    					ILD_TRANSPARENT);
    

    Alternativ kannst du auch ein Handle direkt erhalten:

    HICON ico = ImageList_GetIcon(imgListLarge,iconindex, ILD_TRANSPARENT);
    

    und dieses dann per DrawIconEx skaliert zeichnen.

    Edit: Das Flag ILD_TRANSPARENT ist nur ein Beispiel für die "normale" Anzeige, siehe die Doku zu ImageList_Draw.



  • Ja ehm.. es ging gerade nur um die ImageList für den TreeView. Und da musste ich nur:

    cooky451 schrieb:

    Edit:
    Ah ok - man muss ILC_COLOR32 nutzen, dann funktioniert auch ImageList_AddIcon.

    Das sieht dann in etwa so aus:

    HWND tree = GetDlgItem(wnd, IDC_TREE1);
          char buf[0x1000];
          GetLogicalDriveStrings(sizeof(buf) - 1, buf);
          HIMAGELIST iml = ImageList_Create(12, 12, ILC_COLOR32, 0, 0x100);
          TreeView_SetImageList(tree, iml, TVSIL_NORMAL);
          for (char *p = buf; strlen(p) > 0; p += strlen(p) + 1)
          {
            SHFILEINFO sfi;
            if (SHGetFileInfo(p, 0, &sfi, sizeof(sfi), SHGFI_DISPLAYNAME | SHGFI_ICON | SHGFI_SMALLICON))
            {
              HTREEITEM parent = AddNode(tree, sfi.szDisplayName, 0, ImageList_AddIcon(iml, sfi.hIcon)); // AddNode ist meine Funktion
              // [..]
              FindPathRecursive(tmp, tree, parent, 1); // Das hier auch
            }
          }
    

    So füge ich zwar sinnloserweise viele gleiche Icons in die Liste ein aber ich wüsste nicht, wie ich überprüfen soll, ob ein bestimmtes Icon schon in der Liste ist. Bei Festplattenicons ist das vielleicht noch vertretbar, bei Ordnern aber nicht mehr; deswegen dachte ich mir, dass ich das Ordner Icon immer an Index 0 platziere. Fragt sich nur, welcher Ordner mir da als "Opfer" dienlich sein kann.. mir würde spontan nur der Erste den man mit FindNextFile() findet einfallen, aber ob das sonderlich elegant ist..

    (Ok, das ganze Ding ist ein heilloses Gefrickel, aber na gut 🙄 )



  • Ok, nächstes Problem: Ich kann mich irgendwie nicht zwischen einer ListBox und einer ListView entscheiden.

    ListBox:
    - Man kann schnell und einfach mit der Maus mehrere Einträge markieren.
    - Der Text ist irgendwie näher, sieht kompakter/übersichtlicher aus.

    ListView:
    - Kann Icons neben den Einträgen anzeigen
    - Hat eine Kopfzeile

    Kann ich vielleicht irgendwie eine Listbox mit Icons erstellen? Oder eine ListView mit der Möglichkeit mehrere Dateien mit der Maus zu markieren?



  • Natürlich hat der Listview eine Mehrfachauswahl. Guck einfach in der Hilfe.



  • _Luckie schrieb:

    Natürlich hat der Listview eine Mehrfachauswahl. Guck einfach in der Hilfe.

    Ja.. da ist irgendwie schon ein Unterschied:
    www.youtube.com/watch?v=tS3u1QWs2yk



  • Und was willst du uns damit jetzt sagen? Die Mehrfachauswahl funktioniert genauso, wie es der Benutzer von Listviews, zum Beispiel im Explorer, gewohnt ist.



  • _Luckie schrieb:

    Und was willst du uns damit jetzt sagen?

    Dass es so funktionieren soll wie in der ListBox oO



  • Aha. Du willst also den Benutzer verwirren und ihm die Benutzung deiner Anwendung erschweren. Sehe ich das richtig? warum das gewohnte Standardverhalten ändern?



  • _Luckie schrieb:

    Aha. Du willst also den Benutzer verwirren und ihm die Benutzung deiner Anwendung erschweren. Sehe ich das richtig? warum das gewohnte Standardverhalten ändern?

    Siehst du richtig. Ich mag Benutzer generell nicht und versuche deshalb immer, sie möglichst von ihrer Tätigkeit (dem "Benutzen") abzuhalten. Benutzer sind Verbrecher, denn niemand wird gerne benutzt!

    ---
    Das soll kein "File Explorer" im eigentlichen Sinne werden, sondern nur ein Teil des Programms und eine solche Möglichkeit die Dateien zu markieren wäre perfekt.


  • Mod

    cooky451 schrieb:

    _Luckie schrieb:

    Und was willst du uns damit jetzt sagen?

    Dass es so funktionieren soll wie in der ListBox oO

    Das kann IMHO nicht gehen, das würde das Drag&Drop aushebeln.
    Eine ListBoix kann kein Drah&Drop und wurde nie dafür konzipiert. Anders die neuen Common-Controls.



  • Martin Richter schrieb:

    Das kann IMHO nicht gehen, das würde das Drag&Drop aushebeln.
    Eine ListBoix kann kein Drah&Drop und wurde nie dafür konzipiert. Anders die neuen Common-Controls.

    Und der andere Weg? Ist es möglich einigermaßen komfortabel Icons in eine ListBox einzufügen?


  • Mod

    Dann musst Du Ownerdraw benutzten.

    Nur wenn Du ein "explorer"-like Control baust, sollte es sich nicht wie ene ListBox verhalten.

    Ansonsten, was spricht dagegen, selber die Mausoperationen in einem List-View zu interpretieren...



  • Martin Richter schrieb:

    Dann musst Du Ownerdraw benutzten.

    Das versuche ich zu vermeiden 😃

    Martin Richter schrieb:

    Nur wenn Du ein "explorer"-like Control baust, sollte es sich nicht wie ene ListBox verhalten.

    In einem normalen Dateiexplorer muss man Dateien verschieben/kopieren. Das ist hier nicht der Fall, weswegen ich diese freien "Mausgesten" gerne anderweitig nutzen würde.

    Martin Richter schrieb:

    Ansonsten, was spricht dagegen, selber die Mausoperationen in einem List-View zu interpretieren...

    Hm..
    Auf WM_LBUTTONDOWN warten, Koordinaten mit Fenster/Items vergleichen.. scheint mir alles fast aufwendiger als eine Ownerdraw Editbox. Oder an welchen Ansatz hättest du gedacht?


Anmelden zum Antworten