treeview mit systemicons



  • Hallo,

    ich habe einen funktionierenden treeview aber leider ohne Icons. Ich möchte nun keine Eigenen sondern das jewailige Systemicon vor der Datei in meinem treeview anzeigen lassen. Meine Programmierumgebung ist VC++ 6.0.

    Wie bekomme ich die Systemicons in meine ImageList und wie bekomme ich den Index auf das richtige Icon zum Dateityp?

    Bitte keine Links posten, die meisten kenne ich nach meiner 3tägigen Suche. Ich bin für aussagekräfitgen Quelltext dankbar.

    Auszug aus meinem Quelltext:

    //treeview
     CTreeCtrl* pTree = (CTreeCtrl*)GetDlgItem(IDC_TREE);
    
     //Imagelist mit Systemicons, keine Ahnung wie =)
     //hier Problem  :clown: 
     CImageList ImageList = ???;
    
     pTree->SetImageList(/*&m_ImageList*/NULL, TVSIL_NORMAL);
    
     TV_INSERTSTRUCT tvinsert;
     tvinsert.hParent	= NULL;
     tvinsert.hInsertAfter = TVI_LAST;
     tvinsert.item.mask = TVIF_IMAGE |    TVIF_SELECTEDIMAGE | TVIF_TEXT;
     tvinsert.item.hItem = NULL;
     tvinsert.item.state = 0;
     tvinsert.item.stateMask = 0;
     tvinsert.item.cchTextMax = 6;
     tvinsert.item.iSelectedImage = 0;
     tvinsert.item.cChildren = 0;
     tvinsert.item.lParam = 0;
    
     //Arbeitszeiger auf Anfang meiner verketteten Liste setzen
     erunner = eanchor;
    
     char sz[MAX_PATH];
    
     //Extensions aus der Liste (Form: .*, z.B .txt, .bmp) in den treeview einfügen
     while(erunner)
     {
      strcpy(sz, erunner->cExtension);
      tvinsert.item.pszText = sz;  
      //hier Problem  :clown: 
      //tvinsert.item.iImage  = ???;
      pTree->InsertItem(&tvinsert);
    
      erunner = erunner->next;
     }
    
     //Elemente sortieren
     pTree->SortChildren(NULL);
    

    ---------------------------------

    1000send Dank für Deine Hilfe

    Tobi



  • du kannst die icons auch manuell adden:

    m_iDateiDocIcon = m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_DOC));
    m_iDateiTxtIcon = m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_TXT));
    

    wenn du nur eine bestimmte anzahl/art von dateitypen hast, kannst du das ja ueber die endung selbst hinzufuegen. wie das uebers system geht weiss ich allerdings nicht.

    die icons oben muesstest du eben selber rauskopieren.

    Esco



  • die standard systemicons befinden sich (unter win xp) in folgender dll:

    system32\SHELL32.dll

    Esco



  • Hallo Esco,

    das mit dem selber Adden kennne ich. Mein Problem ist, daß ich alle möglichen Dateitypen, die ich vorher auch nicht kenne, darstellen muss und das mit dem entsprechendem Icon.

    Hat noch jemand einen Vorschlag?

    Tobi



  • SHGetFileInfo() liefert ein Handle für das Icon des jeweiligen Dateityps. Kannst Dir auch mal das IExtractIcon Interface anschaun.
    [Für ein Icon einer bestimmten (existenten) Datei: ExtractAssociatedIcon()]



  • OK, danke das hilft mir schon mal weiter. Nun weiß ich welches Icon aus der Systemiconlist für den jewailigen Typ passt. Trotzdem muss ich meinen treeview noch mit der systemiconlist füttern. Nur wie ich das anstellen soll weiß ich nicht. Hat da jemand einen Tip?

    Danke

    Tobi



  • Problemlösung (auf meinen Quelltext bezogen):

    1. Im Konstruktor Systemiconliste auslesen

    CStepTwo::CStepTwo()
    {
     //m_SmallImageList (Typ: CImageList) mit Systemiconliste füttern
     SHFILEINFO FileInfo; 
    
     m_SmallImageList.Attach( (HIMAGELIST)SHGetFileInfo( "", 0, &FileInfo, 
                                                         sizeof( FileInfo),
                                                         SHGFI_SMALLICON |
                                                         SHGFI_SYSICONINDEX ));
    }
    

    2. In einer Funktion Iconindex in Systemliste dateitypspezifisch auslesen

    int CStepTwo::IconIndex(CString strExt)
    {
     SHFILEINFO info;
    
     DWORD result = SHGetFileInfo(strExt, 
                                   0, 
                                   &info, 
                                   sizeof(SHFILEINFO), 
                                   SHGFI_ICON | 
                                   SHGFI_SMALLICON | 
                                   SHGFI_DISPLAYNAME | 
                                   SHGFI_USEFILEATTRIBUTES 
                                   );
    
     if (result)
    	 return info.iIcon;
    
     else
    	 return 0;
    }
    

    3. Alles zusammenfügen und treeview mit den heißersehnten Icons anzeigen

    void CStepTwo::MakeTree()
     {   
      CTreeCtrl* pTree = (CTreeCtrl*)m_pMassDeleterDlg->GetDlgItem(IDC_TREE);
      pTree->SetImageList(&m_SmallImageList, TVSIL_NORMAL); 
    
      TV_INSERTSTRUCT tvinsert;
      tvinsert.hParent	= NULL;
      tvinsert.hInsertAfter = TVI_LAST;
      tvinsert.item.mask = TVIF_IMAGE |   TVIF_SELECTEDIMAGE | TVIF_TEXT;
      tvinsert.item.hItem = NULL;
      tvinsert.item.state = 0;
      tvinsert.item.stateMask = 0;
      tvinsert.item.cchTextMax = 6;
      tvinsert.item.iSelectedImage = 0;
      tvinsert.item.cChildren = 0;
      tvinsert.item.lParam = 0;
    
      erunner = eanchor;
    
      char sz[MAX_PATH];
    
      while(erunner)
      {
       strcpy(sz, erunner->cExtension);
       tvinsert.item.pszText        = sz; 
    
       //hier wird der Eintrag getätigt 
       tvinsert.item.iImage         = IconIndex(erunner->cExtension);
       tvinsert.item.iSelectedImage = IconIndex(erunner->cExtension);
       pTree->InsertItem(&tvinsert);
       //Ende Eintrag
    
       erunner = erunner->next;
      }
    
      pTree->SortChildren(NULL);
     }
    

    4. Im Destruktor IconList wieder freigeben

    CStepTwo::~CStepTwo()
     {
      m_SmallImageList.Detach();
     }
    

    So simpel iss das :p .

    ⚠ ➡ ➡ www.suckow.biz 😋

    Danke allen für die Tipps.
    Gruß Tobi 🤡



  • @ Admin

    Das wär doch auch mal was für die FAQ. Dort befindet sich nur ein unvollständiger Beispielcode für BCB.

    Und schick gemacht hab ich das Ganze ja nun auch 🙂 .


Anmelden zum Antworten