Es wird nur ein icon im TreeView angezeigt!



  • Hallo zusammen ;),

    ich habe ein funktionierendes TreeView (SDI/Windows Explorer Style) gekodet, aber leider fast ohne Icons.
    Nun möchte ich nicht irgendwelche icons sondern die orig. Windows Explorer Icons.
    Ich benutze dazu die Funktion

    SHGetFileInfo("", 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON)
    

    Ich bekomme aber nicht alle sondern nur ein einziges Icon angezeigt (siehe Link) 😞 :
    http://filehosting.at/images/download.php?file=b14ad20aa1a01412004995061e3202bb

    Ich möchte nicht zuviel Cide posten um niemanden zu erschlagen, daher hier nur zwei kleine Auszüge :

    **1. Hier werden die LaufwerksBuchstaben und Labels ermittelt etc. :
    **

    void CLeftView::CreateRoots()
    {
        CString	strMessage;
        int		nPos = 65;
        CString strDrive;
    	TCHAR	szLabel[128];
    	DWORD	dwVolumeSerialNumber;
    	DWORD	dwMaxNameLength;
    	DWORD	dwFileSystemFlags;
    	TCHAR	szFileSysName[128];
    
    	UINT	uDriveType;
    	CString cstrWirDir;
    	TCHAR	infoBuf[INFO_BUFFER_SIZE];
    	DWORD	dwDriveList = GetLogicalDrives ();			// Anzahl der Laufwerke ermitteln
    
    //----------------------------------------------------------------------------------------------------------------
    
    	GetWindowsDirectory(infoBuf, INFO_BUFFER_SIZE);
    	cstrWirDir = infoBuf;
    	cstrWirDir = cstrWirDir.GetAt(0);
    	cstrWirDir = cstrWirDir + ":";
    
    //----------------------------------------------------------------------------------------------------------------
    
        while (dwDriveList) 
     	{
            if (dwDriveList & 1) 
     		{
    			strDrive = "?:\\";
                strDrive.SetAt (0,nPos);
    			uDriveType = GetDriveType(strDrive);
    
    			GetVolumeInformation (strDrive, szLabel,
    						          sizeof( szLabel ) - 1,
    								  &dwVolumeSerialNumber,
    								  &dwMaxNameLength,
    								  &dwFileSystemFlags,
    								  szFileSysName,
    								  sizeof( szFileSysName ) - 1);	
    
    			switch(uDriveType)
    			{
    
    				// ToDo: Wenn kein Name für Diskettenlaufwerk(und andere), dann vorgefertigtes Label
    				case 2: // Diskettenlaufwerk
    					strDrive = strDrive.Left(2);
    					InsertFileItem("3½-Diskette (" + strDrive +")");
    					break;
    				case 3: // Festplatte
    					strDrive = strDrive.Left(2);
    					// AfxMessageBox(strDrive, MB_OK);
    					InsertFileItem((CString)szLabel + " (" + strDrive +")");
    					break;
    				case 5: // CD-Rom
    					strDrive = strDrive.Left(2);
    					InsertFileItem((CString)szLabel + " (" + strDrive +")"); 					
    					break;
    				default:
    					break;
    			}
            }
            dwDriveList >>= 1;
            nPos++;
        }
    }
    

    2. Hier wird oder sollte zumindest der Baum gebaut werden:

    void CLeftView::InsertFileItem(const CString sFile)
    {
     	CTreeCtrl &trCtrl = this->GetTreeCtrl();
    	trCtrl.SetImageList(&m_SysImageList.GetImageList(), TVSIL_NORMAL); 
    
        SHFILEINFO sfi;
        SHGetFileInfo(sFile, 0, &sfi, sizeof(SHFILEINFO),SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
    
    	//Gibt den IconIndex des Files/Datei zurück
    	int nIconIndex;
    	nIconIndex = sfi.iIcon;
    
    	//Hängt das aktuelle Item an
    	CString sTemp = sFile;
    	TV_INSERTSTRUCT tvis;
    	ZeroMemory(&tvis, sizeof(TV_INSERTSTRUCT));
    	tvis.hParent			= TVI_ROOT;
    	tvis.hInsertAfter		= TVI_LAST;
    	tvis.item.mask			= TVIF_CHILDREN | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT;
    	tvis.item.pszText = sTemp.GetBuffer(sTemp.GetLength());
    	tvis.item.iImage = nIconIndex;  
    	trCtrl.InsertItem(&tvis);
    	sTemp.ReleaseBuffer();
    }
    

    Ich weis nicht ob das genug Code ist um den fehler zu finden, deshalb habe ich hier mal das kleine Projekt (besteht nur aus TreeView) hochgeladen:
    http://www.filehosting.at/files/download.php?file=1cadb172342f4f83577c45e72addfc42

    Vielen Dank für eure Hilfe vorab 🙂
    Gruß
    ShadowEater

    P.S.: Wenn das ganze dann funktioniert wäre es vllt. was für die FAQ?



  • Hi,

    Problem gelöst ! 🙂 😃 😉

    Gruß
    ShadowEater


Anmelden zum Antworten