VC++: Verzeichnis auswaehlen

Hallo
ich suche in Visual C++ (MFC) eine Methode, mit der man ein Dialog-Box oeffnen kann, in der man ein Verzeichnis auswaehlen kann.
Zum Auswaehlen (Oeffnen oder Speichern) von einzelnen Dateien gibt es das. Fuer Verzeichnisse muss es doch soetwas aehnliches geben, oder ?

Danke sagt
Martin

Hi Martin,

na ja … so eigentlich gibt es sowas meines Wissens nicht.
Ich habe mal in meinen alten Sourcen gestoebert, da ich mich erinnern konnte das ich das gleiche Problem auch mal hatte und irgendwie geloest habe. Und ich wurde fuendig!

Allerdings hat es dann etwas gedauert bis ich wieder durchgeblickt habe was ich damals verbrochen hatte (1997), da der Sourcecode so super kommentiert ist.

Also, ich habe ein Klasse von CFileDialog abgeleitet.
Im Konstruktor die OpenFlags auf
m_ofn.Flags &= ~OFN_EXPLORER; // das heist OLDSTYLE-OpenDialog(wie Win3.1)
gesetzt.

Im OnInit meiner Klasse habe ich dann alle Steuerelemente des Dialog, die mit dem Dateinamen, Dateiauswahl etc. zu tun haben ausgeblendet.
Die Steuerelemente die mit den Verzeichnissen zu tun habe auf andere Postionen gerueckt, einen eigenen Schliessen-Knopf als OK-Knopf eingebaut und die Dialoggroesse angepasst.

Dann wurde die OnLBSelChangedNotify Methode ueberlagert
sobald ein Verzeichnis ausgewaehlt wurde, wurde der Verzeichnisname in das EDIT_Control , das eigentlich fuer den Dateinamen vorgesehen ist uebertragen.

Die OnClick-Methode des eigenen OK-Knopfed bewirkt dann beim Beenden das der Verzeichnisname korrekt zurueckgegeben.

Das ganze hat funktioniert und wurde in mehreren Applikationen eingesetzt.

Ich hoffe du kannst dem Ganzen halbwegs folgen, da es doch schon ein etwas wilder „Workaround“ fuer das Problem ist.

Tschau
Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

ich suche in Visual C++ (MFC) eine Methode, mit der man ein
Dialog-Box oeffnen kann, in der man ein Verzeichnis auswaehlen
kann.
Zum Auswaehlen (Oeffnen oder Speichern) von einzelnen Dateien
gibt es das. Fuer Verzeichnisse muss es doch soetwas
aehnliches geben, oder ?

Also es gibt da eine Funktion namens SHBrowseForFolder(), welche diesen Dialog öffnet, in dem du Auswählen kannst, ob nur Ordner oder auch Dateien mit angezeigt werden sollen (wird in Windows XP sehr oft und gern verwendet).

Weitere Informationen hierzu: http://msdn.microsoft.com/library/en-us/shellcc/plat…

Möglicherweise gibts bei MFC eine Klasse dafür, da ich aber nie mit MFC arbeite, weiß ich das nicht :wink:

bye
Christoph

Hallo, so geht’s. Gruß Tobias

int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
 if(uMsg==BFFM\_INITIALIZED)
 {
 ::SendMessage(hwnd, BFFM\_SETSELECTION, TRUE, lpData);
 }

 return 0;
}

bool ShowDirSelect(CString& strMessage, CString& strPreselected, CString& strSelected)
{
 bool bOk = false;
 LPMALLOC pMalloc;
 if (::SHGetMalloc(&pMalloc) == NOERROR)
 {
 BROWSEINFO bi;
 \_TCHAR pszBuffer[MAX\_PATH];
 \_TCHAR pszPreselected[MAX\_PATH];
 LPITEMIDLIST pidl;

 \_tcscpy(pszPreselected, strPreselected);

 bi.hwndOwner = GetSafeHwnd();
 bi.pidlRoot = NULL;
 bi.pszDisplayName = pszBuffer;
 bi.lpszTitle = strMessage;
 bi.ulFlags = BIF\_RETURNFSANCESTORS | BIF\_RETURNONLYFSDIRS;
 bi.lpfn = BrowseCallbackProc;
 bi.lParam =(LPARAM)pszPreselected;

 if ((pidl = ::SHBrowseForFolder(&bi)) != NULL)
 {
 if (::SHGetPathFromIDList(pidl, pszBuffer))
 {
 strSelected = pszBuffer;
 bOk = true;
 }

 pMalloc-\>Free(pidl);
 }

 pMalloc-\>Release();
 }

 return bOk;
}

Hallo Martin !

Also unter VC++ 6 ging das so:

CFileDialog dFileDialog(…);
dFileDialog.m_ofn.Flags = dFileDialog.m_ofn.Flags | OFN_EXPLORER;

Nach dem Starten des FileDialogs konnte man damit auch Ordner auswählen.

mfg
Christof

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo!
Also bei mir (auch VC++ 6) funktioniert das nicht.
Gruß Tobias

Hallo Tobias !

Bei mir war das auch schon einige Jahre her, dass ich das gebraucht habe, also wars vielleicht doch schon vor VC6 :frowning:
Tut mir leid, mehr weiss ich auch nicht.

Schöne Grüsse
Christof

Hallo!
Also bei mir (auch VC++ 6) funktioniert das nicht.
Gruß Tobias