Explorerfenster öffnen aber keinen Dateinamen angeben
-
Ich habe folgenden Code
char path[MAX_PATH + 1] = {0}; OPENFILENAME datei = {sizeof(OPENFILENAME), 0/*HWDN*/, 0/*HINSTANCE*/, "\0\0",0/*LPSTR*/, 0/*DWORD*/, 0 /*DWORD*/, path/*LPSTR*/, MAX_PATH /*DWORD*/, 0 /*Parameter für den Dateinamen /*LPSTR*/, 0 /*DWORD*/, /*LPCSTR*/ ".\\", /*LPCSTR*/ "Dateipfad Auswählen", 0 /*DWORD*/ }; if(FALSE == GetSaveFileName (&datei)) { MessageBoxA (0,"Ungültige Dateipfad!", "Fehler" , 0); return; } else { MessageBoxA (0, path, "O.K.", MB_ICONQUESTION);
am Ende gehts noch ein wenig weiter da sich der Pfad noch aus anderen Methoden zusammensetzt.
Nun mein Problem:
Das Explorerfenster öffnet sich wie gewünscht auch kann ich den benötigten Ordner auswählen, nur leider muss ich einen Dateinamen eingeben und genau das möchte ich nicht, ich möchte über das Explorerfenster nur einen Dateipfad auswählen wo später eine andere Methode dann einen Ordner anlegt und Dateien abspeichert. Einzig die Eingabe eines Dateinamens stört, da ich bevor dort nichts eingegeben wurde nicht auf speichern klicken kann.
-
Sucht Du vielleicht das ?
http://www.codeproject.com/Articles/13088/How-to-Browse-for-a-Folder
-
Ist nicht ganz das was ich meine. Ich wollte das sich ein Explorerfenster öffnet, man sich dort einen Pfad aussuchen kann z.B.: "C:\Daten" dieser Pfad in ner Varibalen gespeichert wird in meinem Code ist das "Path" und man eben nicht wie in meinem Code bei Dateinamen was eingeben muss bevor man "Ok" drücken kann. Dieser Pfad wird dann mit einer anderen Methode verknüpft die dann bei dem ausgewählten Pfad z.B.: "C:\Daten" einen Ordner anlegt (in meinem Fall Name, Jahr, Monat, Tag), außerdem werden dann nach und nach in den Ordner automatisch Daten geschrieben.
-
man eben nicht wie in meinem Code bei Dateinamen was eingeben muss
Und genau das mache ich mit SHBrowseForFolder
-
Problem bei der Funktion ist das es ne Möglichkeit gibt nen neuen Ordner anzulegen und diese sollte man nicht haben (verwirrend), da ja nach der Pfadauswahl automatisch über eine andere Funktion dort ein Ordner angelegt wird.
-
Programmierfuzie schrieb:
Problem bei der Funktion ist das es ne Möglichkeit gibt nen neuen Ordner anzulegen und diese sollte man nicht haben (verwirrend), da ja nach der Pfadauswahl automatisch über eine andere Funktion dort ein Ordner angelegt wird.
Der Nutzer kann auch so da Verzeichnisse anlegen, da er offensichtlich da ja auch Schreibrechte hat und dieses Verzeichnis wie auch immer erreichen kann. Wieso stört dich dann der Button? Wenn du mal richtig gelesen hättest (vgl: http://msdn.microsoft.com/en-us/library/windows/desktop/bb762115(v=vs.85).aspx), dann hättest du festgestellt, dass man den Button auch weglassen kann. Übergib BIF_NONEWFOLDERBUTTON in der BROWSEINFO unter ulFlags und dann ist er weg.
Für alle, die es wünschen, dass beim Öffnen der Dialogbox ein voreingestellter Pfad selektiert ist, die könnten das so realisieren://Callbackfunktion für die Verzeichnisvorgabe des SHBrowseForFolder-Dialogs int static CALLBACK BrowseCallbackProc(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData) { CString* pString= (CString*)lpData; ASSERT( pString != NULL ); switch(uMsg) { case BFFM_INITIALIZED: { TCHAR szText[MAX_PATH] = {0}; if (!pString->IsEmpty()) { _tcscpy(szText,*pString); } else GetCurrentDirectory(sizeof(szText),szText); ::SendMessage( hWnd,BFFM_SETSELECTION, TRUE, reinterpret_cast<LPARAM>(szText)); } break; case BFFM_SELCHANGED: { TCHAR szText[MAX_PATH] = {0}; SHGetPathFromIDList(reinterpret_cast<LPITEMIDLIST>(lParam), szText); ::SendMessage(hWnd, BFFM_SETSTATUSTEXT, 0,reinterpret_cast<LPARAM>(szText)); } break; } return 0; } //MFC-Version der Klasse aus codeproject s. Vorschlag MiP bool GetFolder(CString& csFolder, CString csCaption /*= NULL*/, HWND hWndOwner /*= NULL*/) { bool bSuccess = false; // The BROWSEINFO struct tells the shell // How it should display the dialog. BROWSEINFO browseInfo; memset(&browseInfo, 0, sizeof(browseInfo)); browseInfo.ulFlags = BIF_USENEWUI; //bzw. z.B. BIF_NONEWFOLDERBUTTON; browseInfo.hwndOwner = hWndOwner; browseInfo.lpszTitle = csCaption; browseInfo.lpfn = (BFFCALLBACK) &BrowseCallbackProc; //dadurch wird die Vorgabe browseInfo.lParam = (LPARAM)&csFolder; //eines Verzeichnisses möglich // Must call this if using BIF_USENEWUI ::OleInitialize(NULL); // Show the dialog and get the itemIDList for the selected folder. LPITEMIDLIST pIDL = ::SHBrowseForFolder(&browseInfo); if(pIDL != NULL) { // Create a buffer to store the path, then get the path. TCHAR lpzTempFolder[MAX_PATH + 1]; if(::SHGetPathFromIDList(pIDL, lpzTempFolder) != 0) { bSuccess = true; } // Free the item id list CoTaskMemFree(pIDL); csFolder = lpzTempFolder; } ::OleUninitialize(); return bSuccess; }
-
Vielen Dank. Funktion läuft jetzt wie gewünscht!!
-
Falscher Forumbereich ( denke ich bin neu im forum ) das gehört wohl eher in den WinApi bereich. Und googlen hilft wohl auch ^^