CFileDialog der nur die Ordner anzeigt (SHBrowseForFolder)



  • Ihr kennt das vieleicht von einer Programminstallation her. Dieses kleine Fenster in dem nur ein Baum angezeigt wird in dem man einen Beliebigen Ordner wählen kann.
    Und um genau das Teil gehts mir.

    Das ganze Funktioniert mit:

    SHBrowseForFolder(&BrowseInfo);
    

    Und das geht auch richtig gut (sofern man den Code hat). Allerdings wird beim Aufruf immer der 'Root' Ordner und dessen Unterordner angezeigt. Solange man keinen anderen 'Root' Ordner in der BrowseInfo Struktur angibt ist dies immer der Arbeitsplatz.

    Aber genau das soll ich jetzt ändern. Meine Aufgabe ist es, in diesem Dialog zum Ordner zu springen, in dem das Programm liegt. Und soweit ich der MSDN Doku trauen kann ist das unmöglich (wenn dabei noch alle übergeordneten Laufwerke oder z.B. der Arbeitsplatz auswählbar sein sollen). Wenn ich z.B. in der BrowseInfo Struktur den Programminstallations Ordner angebe, dann werden die übergeordneten Ordner, Laufwerke usw. nicht mit angezeigt.

    Ich hoffe das ich mein Problem halbwegs verständlich erklären konnte. Wie gesagt: ich will diesen Ordner wählen Dialog und in diesem Dialog soll er (ähnlich wie im CFileDialog in der MFC) den Ordner markiert haben, in dem das Programm liegt (ohne alle übergeordneten abzuschneiden).

    Hier noch kurz mein Code zum Aufruf des Dialogs:

    {
    			BROWSEINFO BrowseInfo;
    			ITEMIDLIST *ItemDirectoryList = new ITEMIDLIST;
    			BOOL OrdnerWahl = FALSE;
    			char pfad[MAX_PATH*2];
    
    			ZeroMemory(&BrowseInfo, sizeof(BROWSEINFO));
    
    			if(DialogFenster != NULL)
    				BrowseInfo.hwndOwner = DialogFenster->GetSafeHwnd();
    
    			BrowseInfo.ulFlags   = BIF_RETURNONLYFSDIRS;
    
    			ItemDirectoryList = SHBrowseForFolder(&BrowseInfo);
    
    			pfad[0] = _T('\0');
    
    			if (ItemDirectoryList)
    			{
    				if (SHGetPathFromIDList(ItemDirectoryList, pfad))
    				{
    					neuerPfad = (CString)pfad;
    
    					OrdnerWahl = TRUE;
    				}
    
    				IMalloc *pMalloc = NULL; 
    				if (SUCCEEDED(SHGetMalloc(&pMalloc)) && pMalloc) 
    				{  
    					pMalloc->Free(ItemDirectoryList);  
    					pMalloc->Release(); 
    				}
    }
    

Anmelden zum Antworten