tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
15
ZUGRIFFE
7777
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von anmae
    anmae anmae ist offline Mitglied Gold
    Registriert seit
    Aug 2005
    Ort
    Chemnitz
    Beiträge
    203
    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?


    Danke
    Geä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.

  2. #2
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Nimm die Funktion SHBrowseForFolder()

    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  3. #3
    Avatar von anmae
    anmae anmae ist offline Mitglied Gold
    Registriert seit
    Aug 2005
    Ort
    Chemnitz
    Beiträge
    203
    Danke erstmal.

    ich hab hier im Forum das gefunden:

    Code :
    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);
    leider gibt das bei mir einen Absturz nach dem Schließen des Dialogs !?
     
    Kaum macht man's richtig, gehts auch schon!!

    eigenes:
    www.psywex.de - Portal für professionelle Onlineforschung.

  4. #4
    Avatar von anmae
    anmae anmae ist offline Mitglied Gold
    Registriert seit
    Aug 2005
    Ort
    Chemnitz
    Beiträge
    203
    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.

  5. #5
    Avatar von anmae
    anmae anmae ist offline Mitglied Gold
    Registriert seit
    Aug 2005
    Ort
    Chemnitz
    Beiträge
    203
    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.

  6. #6
    Wu-mc Wu-mc ist offline Mitglied Silber
    Registriert seit
    Nov 2005
    Beiträge
    75
    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

  7. #7
    Avatar von anmae
    anmae anmae ist offline Mitglied Gold
    Registriert seit
    Aug 2005
    Ort
    Chemnitz
    Beiträge
    203
    sehr geil, vielen Dank
     
    Kaum macht man's richtig, gehts auch schon!!

    eigenes:
    www.psywex.de - Portal für professionelle Onlineforschung.

  8. #8
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    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
    bergschof bedankt sich. 
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  9. #9
    Robertico Robertico ist offline Mitglied Bronze
    Registriert seit
    Sep 2005
    Ort
    Aachen (NRW)
    Beiträge
    37
    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.
     

  10. #10
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    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

  11. #11
    Robertico Robertico ist offline Mitglied Bronze
    Registriert seit
    Sep 2005
    Ort
    Aachen (NRW)
    Beiträge
    37
    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ß Robert
    Geändert von Robertico (17.04.06 um 19:44 Uhr)
     

  12. #12
    Robertico Robertico ist offline Mitglied Bronze
    Registriert seit
    Sep 2005
    Ort
    Aachen (NRW)
    Beiträge
    37
    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)
     

  13. #13
    Robertico Robertico ist offline Mitglied Bronze
    Registriert seit
    Sep 2005
    Ort
    Aachen (NRW)
    Beiträge
    37
    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ß Robert
    Geändert von Robertico (13.06.06 um 14:59 Uhr)
     

  14. #14
    Onkel Schuppig Onkel Schuppig ist offline Mitglied Gold
    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.
     

  15. #15
    SliderBOR SliderBOR ist offline Grünschnabel
    Registriert seit
    May 2004
    Ort
    Bocholt
    Beiträge
    3
    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

  1. file open dialog extension filter will nicht so richtig
    Von Tinobee im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 4
    Letzter Beitrag: 11.02.08, 16:11
  2. Open File & Restart
    Von Nabi im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 26.07.06, 12:25
  3. SQL Fehler: Can't open file ...
    Von mauli_rulez im Forum Relationale Datenbanksysteme
    Antworten: 6
    Letzter Beitrag: 14.02.06, 08:32
  4. Open File Dialog Filter
    Von lusiphur im Forum .NET Windows Forms
    Antworten: 2
    Letzter Beitrag: 23.08.05, 14:08
  5. FILE/OPEN und FILE/SAVE
    Von wlado im Forum VisualStudio & MFC
    Antworten: 4
    Letzter Beitrag: 22.06.04, 17:46