-
Hallo,
ich habe einen Speichern unter Dialog. Diesen möchte ich nun so anpassen das ich nur den Ordner auswählen kann und nicht den Dateinamen.
Wie geht das?
Also ich möchte einfach nur den Speicherort für eine Datei auswählen. Wenn das nicht mit dem Dialog geht, gibt es vielleicht eine Alternative?
DankeGeändert von anmae (08.03.06 um 10:06 Uhr)
Kaum macht man's richtig, gehts auch schon!!
eigenes:
www.psywex.de - Portal für professionelle Onlineforschung.
-
Nimm die Funktion SHBrowseForFolder()
Gruß
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
Danke erstmal.
ich hab hier im Forum das gefunden:
leider gibt das bei mir einen Absturz nach dem Schließen des DialogsCode :1 2 3 4 5 6 7 8 9 10 11 12
BROWSEINFO bi; bi.hwndOwner = GetSafeHwnd(); bi.pidlRoot = NULL; bi.pszDisplayName = "Speichern unter"; bi.lpszTitle = NULL; bi.ulFlags = BIF_RETURNONLYFSDIRS; bi.lpfn = NULL; bi.lParam = 0; bi.iImage = 0; LPITEMIDLIST pidl; pidl = SHBrowseForFolder(&bi);
!?
Kaum macht man's richtig, gehts auch schon!!
eigenes:
www.psywex.de - Portal für professionelle Onlineforschung.
-
Selbst mit der Funktion PidlBrowse(...) aus der MSDN bekomme ich einen Absturz nach dem Dialog.
Ich hab es auch schon mit m_hWnd anstatt mit GetSafeWnd() versucht - das selbe.
Hat jemand eine Idee?Kaum macht man's richtig, gehts auch schon!!
eigenes:
www.psywex.de - Portal für professionelle Onlineforschung.
-
Die Funktion SHGetFolderLocation() kennt er nicht.
kann es sein, das ich irgendwas nicht included habe und mit einer Überladenen Funktion arbeite welche mir dann den Absturz beschert?Kaum macht man's richtig, gehts auch schon!!
eigenes:
www.psywex.de - Portal für professionelle Onlineforschung.
-
ich habs so gelöst:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
#include <shlobj.h> ... static BROWSEINFO bi; TCHAR szPath[MAX_PATH]; ITEMIDLIST * browser; LPMALLOC lpMalloc; // Browsinfo initialisieren bi.hwndOwner = hDlg; bi.pidlRoot = NULL; bi.pszDisplayName = NULL; bi.lpszTitle = TEXT ("Bitte wählen Sie das gewünschte Verzeichnis aus!"); bi.ulFlags = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS; bi.lpfn = NULL; bi.lParam = 0; bi.iImage = 0; // Dialog zum Verzeichnis wählen einblenden browser = SHBrowseForFolder (&bi); // und gewähltes Verzeichnis auswerten if (browser) { if(SHGetPathFromIDList (browser, szPath)) { SetWindowText (hEditDevice, szPath); } } SHGetMalloc (&lpMalloc); lpMalloc->lpVtbl->Free (lpMalloc, browser);
Wobei "lpMalloc->lpVtbl->Free (lpMalloc, browser);" in C++ so aussehen sollte: "lpMalloc->Free (browser);"
Und je nach dem Welche Parameter du bei bi.ulFlags verwendest kannst du weitere Funktionen zu dem Ordner wählen Dialog hinzufügen. Schau dazu einfach mal beim MSDN nach, dort sind die einzelnen Flags gut erklärt. Hoffe das bringt dich weiter!Mit freundlichen Grüßen
Wu-mc
-
sehr geil, vielen Dank
Kaum macht man's richtig, gehts auch schon!!
eigenes:
www.psywex.de - Portal für professionelle Onlineforschung.
-
Ich habe mal eine Variante gebaut, mit der man auch einen Pfad voreistellen und festlegen kann, ab welchen Laufwerk bzw. Ordner gebrowst wird:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
// Deklaration (in .h) ///////////////////////////////////////////////////////////////////////////////// CString BrowseFolder(LPCTSTR lpszTitle, LPCTSTR lpszDefault, LPCTSTR lpszRoot); static int CALLBACK BrowseCallBackProc(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM pData); // Implementierung (in .cpp) ///////////////////////////////////////////////////////////////////////////////// #ifndef BIF_NEWDIALOGSTYLE #define BIF_NEWDIALOGSTYLE 0x0040 #endif //------------------------------------------------------------------- // Beschreibung: Pfadauswahldialog //------------------------------------------------------------------- // Parameter: lpszDefault ... voreingestellter Pfad // lpszTitle ... Dialogtitel // lpszRoot ... Pfad, ab dem Struktur angezeigt // wird // RETURN Gewählter Ordner oder leer bei Abbruch //------------------------------------------------------------------- CString CMyDialog::BrowseFolder( LPCTSTR lpszTitle, LPCTSTR lpszDefault, LPCTSTR lpszRoot) { BROWSEINFO brInf; LPITEMIDLIST pidl; LPSHELLFOLDER pshf; ULONG pchEaten; OLECHAR olePath[_MAX_PATH]; TCHAR lpBuffer[_MAX_PATH]; if( SUCCEEDED(SHGetDesktopFolder(&pshf)) ) { if( lpszRoot ) { MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, (LPCSTR)lpszRoot, -1, olePath, _MAX_PATH); pshf->ParseDisplayName(GetSafeHwnd(), NULL, olePath, &pchEaten, &pidl, NULL); brInf.pidlRoot = pidl; } else { brInf.pidlRoot = NULL; } brInf.hwndOwner = GetSafeHwnd(); brInf.pszDisplayName = lpBuffer; brInf.lpszTitle = lpszTitle; brInf.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE; brInf.lpfn = BrowseCallBackProc; brInf.lParam = (LPARAM)lpszDefault; brInf.iImage = 0; pidl = SHBrowseForFolder(&brInf); if( pidl ) { SHGetPathFromIDList(pidl, lpBuffer); return CString(lpBuffer); } } return CString(_T("")); } //------------------------------------------------------------------- // Callback-Funktion für SHBrowseForFolder //------------------------------------------------------------------- int CALLBACK CMyDialog::BrowseCallBackProc( HWND hwnd, UINT uMsg, LPARAM lp, LPARAM pData ) { switch( uMsg ) { case BFFM_INITIALIZED: if( pData ) { ::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, pData); } break; } return 0; }
Gruß
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
Habe noch eine Frage dazu.
Es klappt alles. Das einzige Problem, dass ich habe:
Das Fenster öffnet sich modal hinter meinem Dialog. Komme dort nur mit, Alt-Tab oder alles minimieren und Dialog dann wieder maximieren, dran.
Was kann ich da machen?
Danke Robert.
-
Hast du beim "hwndOwner"-Member von BROWSEINFO den Fensterhandle des Dialogs verwendet?
Gruß
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
Habe viel versucht. Muß eigendlich auch richtig sein, da ich bis dieser Dialog beendet ist auf dem Haupt-Dialog nichts machen kann.
Versucht habe ich u.a.:
browseInfo.hwndOwner = GetSafeHwnd( ) ;
browseInfo.hwndOwner = AfxGetApp()->m_pMainWnd->m_hWnd;
Noch was: Alt-Taste reicht, dann ist es vorne:
Gruß RobertGeändert von Robertico (17.04.06 um 19:44 Uhr)
-
Habe festgestellt, das dies ein grundsätzliches Problem ist. Selbst eine einfache MessageBox bleibt im Hintergrund.
In anderen Projekten ist das nicht der F all. Also habe ich dort etwas verbockt.
In dem Dialog habe ich ein CStatic mit einem OpenGl-Fenster lasse ich das nicht erzeugen geht alles klar.
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
void COpenGLControl::Create( CRect rect, CWnd* pParentWnd) { int BackBufferWidth = GetSystemMetrics(SM_CXSCREEN); rect.right=BackBufferWidth-9; nVerhaeltnis=(float)(rect.right - rect.left)/(float)(rect.bottom-rect.top); CString className = AfxRegisterWndClass( CS_HREDRAW | CS_VREDRAW | CS_OWNDC, NULL, (HBRUSH)GetStockObject(BLACK_BRUSH), NULL); CreateEx( 0, className, "OpenGL", WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, rect, pParentWnd, 0); pParentWnd, nID, pContext); }Geändert von Robertico (18.04.06 um 16:10 Uhr)
-
Es ist zwar schon etwas her, habe das Problem jetzt gelößt. Sollte jemand auch mal solche Schwierigkeiten haben:
Vorher: openGLControl.ShowWindow(SW_HIDE);
Nachher: openGLControl.ShowWindow(SW_SHOW);
Ist zwar eine Krücke, aber es funktioniert.
Gruß RobertGeändert von Robertico (13.06.06 um 14:59 Uhr)
-
18.06.06 21:18 #14
- Registriert seit
- Apr 2005
- Beiträge
- 191
Ich kann mich nur wundern, dass man für solch eine Standard-Funktion ein Extra-Programm schreiben muss. Microsoft könnte dem GetOpenFileName() doch ein GetOpenDirectoryName() beilegen.
-
Hallo,
ich habe ein kleine Problem der hier genannten Lösung. Soweit funktioniert alles, aber ich möchte gerne abfragen, ob ich überhaupt Schreib- und Leserechte auf das Verzeichnis habe, das ich mit dem Dialog auswähle.
Wie mache ich das?
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
static BROWSEINFO bi; TCHAR szPath[MAX_PATH]; LPMALLOC lpMalloc; bi.hwndOwner = GetSafeHwnd(); bi.pidlRoot = NULL; bi.pszDisplayName = szPath; bi.lpszTitle = "Bitte wählen Sie das Zielverzeichnis"; bi.ulFlags = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE; bi.lpfn = NULL; bi.lParam = 0; bi.iImage = 0; ITEMIDLIST *pidl; pidl = SHBrowseForFolder(&bi); if (pidl) { if(SHGetPathFromIDList (pidl, szPath)) { CStrTargetDirectory = szPath; UpdateData(FALSE); DirectoryInfo* di = new DirectoryInfo(CStrTargetDirectory); if(!di->Exists) { CButtonIncludeSubdirectories.EnableWindow(FALSE); MessageBox("Verzeichnis existiert nicht", "Warnung", MB_OK); } } SHGetMalloc(&lpMalloc); lpMalloc->Free(pidl); }Geändert von SliderBOR (01.03.08 um 00:17 Uhr)
Intel outside, Power inside AMD RuLeZ...
Ähnliche Themen
-
file open dialog extension filter will nicht so richtig
Von Tinobee im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 4Letzter Beitrag: 11.02.08, 16:11 -
Open File & Restart
Von Nabi im Forum C/C++Antworten: 1Letzter Beitrag: 26.07.06, 12:25 -
SQL Fehler: Can't open file ...
Von mauli_rulez im Forum Relationale DatenbanksystemeAntworten: 6Letzter Beitrag: 14.02.06, 08:32 -
Open File Dialog Filter
Von lusiphur im Forum .NET Windows FormsAntworten: 2Letzter Beitrag: 23.08.05, 14:08 -
FILE/OPEN und FILE/SAVE
Von wlado im Forum VisualStudio & MFCAntworten: 4Letzter Beitrag: 22.06.04, 17:46



1Danke

Zitieren
Login






