Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » eVC++ : Auswahl eines Verzeichnisses

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
28.03.2006, 13:01 Uhr
Tommyknocker1980



Hallo,

in meinem Programm möchte ich dem Benutzer die Möglichkeit geben, ein Verzeichnis auszuwählen (dorthin sollen Log-Files , etc geschrieben werden).

Momentan kann der Benutzer den gewünschten Pfad in einer Editbox eingeben, ist aber nicht die schönste Lösung.
Schöner wäre irgendwie eine Auswahlliste, aus der der Benutzer das Zielverzeichnis wählen kann (Baumssturkturmäig, mit aufklappenden Unterverzeichnisses).


Gibt es unter Embedded Visual C++ 4.0 irgendwie die Möglichkeit die Verzeichnisstruktur in einem geeigneten Dialog, oder in einer Baumstruktur darzustellen, damit der User darin seine Auswahl treffen kann?

Vielen Dank für eine Antwort.

Gruß,
Tom

Dieser Post wurde am 28.03.2006 um 13:02 Uhr von Tommyknocker1980 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.03.2006, 13:20 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Ob es das Ding unter VC4 gibt weiss ich nicht aber normalerweise heisst sowas FileDialog... Einfach mal danach suchen...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.03.2006, 13:33 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


SHBrowseForFolder (er will ja nen Ordnerauswahldialog) nur auch ka obs den beim 4er VC gibt (woher weiß Windalf eigentlich das es VC4 ist?)
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.03.2006, 14:01 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)



Zitat von Tommyknocker1980:

unter Embedded Visual C++ 4.0



Ich denke nicht das die 4er Version das Problem sein könnte, sondern wenn dann eher die Embedded Umgebung. Aber das wird man ja in der MSDN sehen...

Dieser Post wurde am 28.03.2006 um 14:02 Uhr von Guybrush Threepwood editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
28.03.2006, 15:46 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


SHBrowseForFolder ist ab Windows CE 4.0 dabei.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
29.03.2006, 08:35 Uhr
~Tommyknocker1980
Gast


In der Doku steht zu SHBrowseForFolder unter Requirements folgendes:


Zitat:

OS Versions: Windows CE .NET 4.0 and later.
Header: Shlobj.h.
Link Library: Ceshell.lib.



Die Textvervollständigung meines eVC++ 4.0 scheint die Funktion zu kennen (obwohl es kein .NET ist), doch auch wenn ich die Header-Datei inkludiere und die Library linke geht es nicht:


Zitat:

error LNK2019: unresolved external symbol SHBrowseForFolder referenced in function "protected: virtual int __cdecl CMyDlg::OnInitDialog(void)" (?OnInitDialog@CMyDlg@@MAAHXZ)
ARMV4Dbg/MyDlg.exe : fatal error LNK1120: 1 unresolved externals




Laut www.tech-archive.net/Archive/PocketPC/microsoft.public.pocketpc.developer/2005-11/msg00414.html scheint nicht zu gehen.


Gibt es andere Alternativen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
29.03.2006, 13:13 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


jo in der "normalen" SHBrowseForFolder-MSDN-Seite steht "Windows CE: not supported" drin...

d.h selbst nachprogrammieren
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
29.03.2006, 18:33 Uhr
mmc20
puss in boots


hi, auf www.codeprojet.com hatte ich mal was entsprechendes gefunden:
FolderDialog.h

C++:
/////////////////////////////////////////////////////////////////////////////
/*
DESCRIPTION:
    CFolderDialog  - Folder Selection Dialog Class
    Copyright(C) Armen Hakobyan, 2002 - 2005
    www.codeproject.com/dialog/cfolderdialog.asp
    
VERSION HISTORY:
    24 Mar 2002 - First release
    30 Mar 2003 - Some minor changes
                - Added missing in old Platform SDK new flag definitions  
                - Added support for both MFC 6.0 and 7.0
                - Added OnIUnknown handler for Windows XP folder filtration
                - Added SetExpanded and SetOKText and GetSelectedFolder functions
    24 May 2003 - Added OnSelChanged implementation
    14 Jul 2003 - Added custom filtration for Windows XP, thanks to Arik Poznanski
    02 Jan 2004 - Added GetRootFolder, uncomment if needed
    15 Feb 2005 - Small bug fix in DoModal, thanks to WindSeven
*/

/////////////////////////////////////////////////////////////////////////////

#ifndef __FOLDERDLG_H__
#define __FOLDERDLG_H__

#if defined( _MSC_VER ) && ( _MSC_VER >= 1020 )
    #pragma once
#endif

/////////////////////////////////////////////////////////////////////////////

#ifndef __AFXDLGS_H__
    #include < AfxDlgs.h >
#endif

#ifndef __ATLCONV_H__
    #include < AtlConv.h >    // MBCS/Unicode Conversion Macros
#endif

// Uncomment if using GetRootFolder
//#ifndef _INC_SHLWAPI
//    #include < shlwapi.h >
//#endif
//#pragma comment( lib, "shlwapi.lib" )

/////////////////////////////////////////////////////////////////////////////

#ifndef        SAFE_DELETE2
    #define SAFE_DELETE2( p ) \
        if( p ){ delete[] p; p = NULL; }
#endif

#ifndef        SAFE_ZEROMEMORY
    #define SAFE_ZEROMEMORY( p, size ) \
        if( p ){ ZeroMemory( p, size ); }
#endif

#ifndef    SAFE_RELEASE
    #if defined( __cplusplus )
        #define SAFE_RELEASE( p ) \
            if( p ){ p->Release(); p = NULL; }
    #else
        #define SAFE_RELEASE( p ) \
            if( p ){ p->lpVtbl->Release( p ); p = NULL; }
    #endif
#endif

#ifndef        SAFE_COTASKMEMFREE
    #define SAFE_COTASKMEMFREE( p ) \
        if( p ){ CoTaskMemFree( (LPVOID)p ); p = NULL; }
#endif

#ifndef        _countof
    #define _countof( x ) \
        ( sizeof( x ) / sizeof( x[ 0 ] ) )
#endif

/////////////////////////////////////////////////////////////////////////////

#ifndef BFFM_SETOKTEXT                    // Version 5.0 or later
    #define BFFM_SETOKTEXT                ( WM_USER + 105 )    // Unicode only, req. BIF_USENEWUI
    #define BFFM_SETEXPANDED            ( WM_USER + 106 )    // Unicode only, req. BIF_USENEWUI
#endif

#ifndef BIF_NEWDIALOGSTYLE                // Version 5.0 or later
    #define BIF_NEWDIALOGSTYLE            0x0040    
    #define BIF_BROWSEINCLUDEURLS        0x0080
    #define BIF_UAHINT                    0x0100                // Req. BIF_NEWDIALOGSTYLE
    #define BIF_NONEWFOLDERBUTTON        0x0200
    #define BIF_NOTRANSLATETARGETS        0x0400    
    #define BIF_SHAREABLE                0x8000                // Req. BIF_USENEWUI
    #define BIF_USENEWUI                ( BIF_NEWDIALOGSTYLE | BIF_EDITBOX )    
#endif

/////////////////////////////////////////////////////////////////////////////

class CFolderDialog : public CCommonDialog
{
    DECLARE_DYNAMIC( CFolderDialog )

public:
    CFolderDialog(    IN LPCTSTR    pszTitle    = NULL,
                    IN LPCTSTR    pszSelPath    = NULL,
                    IN CWnd*    pWndParent    = NULL,
                    IN UINT        uFlags        = BIF_RETURNONLYFSDIRS );
    virtual ~CFolderDialog( VOID );

public:
    #if ( _MFC_VER >= 0x0700 )    // VC++ 2002 (7.0)
        virtual INT_PTR        DoModal( VOID );
    #else
        virtual INT            DoModal( VOID );
    #endif

    BOOL    SetRootFolder( IN LPCTSTR pszPath );
    BOOL    GetRootFolder( IN OUT LPTSTR pszPath );
    BOOL    SetSelectedFolder( IN LPCTSTR pszPath );

public:    
    AFX_INLINE LPCTSTR    GetFolderPath( VOID )  const;
    AFX_INLINE LPCTSTR    GetFolderName( VOID )  const;
    AFX_INLINE INT        GetFolderImage( VOID ) const;        
    AFX_INLINE LPCTSTR    GetSelectedFolder( VOID ) const;

    AFX_INLINE BROWSEINFO&         GetBI( VOID );
    AFX_INLINE const BROWSEINFO& GetBI( VOID ) const;

protected:    
    BROWSEINFO    m_bi;

    TCHAR    m_szSelPath[ MAX_PATH ];
    TCHAR    m_szFolPath[ MAX_PATH ];

protected:
    DECLARE_MESSAGE_MAP()
    
protected: // Overridables

    virtual VOID OnInitialized( VOID );
    virtual VOID OnSelChanged( IN LPITEMIDLIST  pItemIDList );
    virtual INT     OnValidateFailed( IN LPCTSTR /*pszPath*/ );        

protected: // Windows XP or later
    virtual VOID OnIUnknown( IN IUnknown* /*pIUnknown*/ );
    
protected: // Valid to call only from the above handlers

    VOID EnableOK( IN BOOL bEnable = TRUE );
    VOID SetSelection( IN LPITEMIDLIST pItemIDList );
    VOID SetSelection( IN LPCTSTR pszPath );    
    VOID SetStatusText( IN LPCTSTR pszText );

protected: // Shell version 5.0 or later:
    VOID SetExpanded( IN LPCTSTR pszPath );
    VOID SetExpanded( IN LPITEMIDLIST pItemIDList );
    VOID SetOKText( IN LPCTSTR pszText );

private:
    HWND m_hWnd; // used only in the callback function

private:
    static INT CALLBACK BrowseCallbackProc(
        IN HWND hWnd, IN UINT uMsg, IN LPARAM lParam, IN LPARAM lpData
    );
};

/////////////////////////////////////////////////////////////////////////////

AFX_INLINE LPCTSTR CFolderDialog::GetSelectedFolder( VOID ) const
    { return m_szSelPath; }

AFX_INLINE BROWSEINFO& CFolderDialog::GetBI( VOID )
    { return m_bi; }

AFX_INLINE const BROWSEINFO& CFolderDialog::GetBI( VOID ) const
    { return m_bi; }

/////////////////////////////////////////////////////////////////////////////
// Filled after a call to DoModal

AFX_INLINE LPCTSTR CFolderDialog::GetFolderPath( VOID ) const
    { return m_szFolPath; }

AFX_INLINE LPCTSTR CFolderDialog::GetFolderName( VOID ) const
    { return m_bi.pszDisplayName; }

AFX_INLINE INT CFolderDialog::GetFolderImage( VOID ) const
    { return m_bi.iImage; }

/////////////////////////////////////////////////////////////////////////////
#endif // __FOLDERDLG_H__
/////////////////////////////////////////////////////////////////////////////

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
29.03.2006, 18:34 Uhr
mmc20
puss in boots


FolderDialog.cpp

C++:
/////////////////////////////////////////////////////////////////////////////
/*
DESCRIPTION:
    CFolderDialog  - Folder Selection Dialog Class
    Copyright(C) Armen Hakobyan, 2002 - 2005
    www.codeproject.com/dialog/cfolderdialog.asp

VERSION HISTORY:
    24 Mar 2002 - First release
    30 Mar 2003 - Some minor changes
                - Added missing in old Platform SDK new flag definitions  
                - Added support for both MFC 6.0 and 7.0
                - Added OnIUnknown handler for Windows XP folder filtration
                - Added SetExpanded and SetOKText and GetSelectedFolder functions
    24 May 2003 - Added OnSelChanged implementation
    14 Jul 2003 - Added custom filtration for Windows XP, thanks to Arik Poznanski
    29 Nov 2003 - Added SetRootFolder, thanks to Eckhard Schwabe ( and Jose Insa )
    02 Jan 2004 - Added GetRootFolder, uncomment if needed
    15 Feb 2005 - Small bug fix in DoModal, thanks to WindSeven
*/

/////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "FolderDlg.h"

/////////////////////////////////////////////////////////////////////////////

#ifndef BFFM_VALIDATEFAILED
    #ifndef UNICODE
        #define BFFM_VALIDATEFAILED        3
    #else
        #define BFFM_VALIDATEFAILED        4    
    #endif
#endif

#ifndef BFFM_IUNKNOWN
    #define BFFM_IUNKNOWN                5
#endif

/////////////////////////////////////////////////////////////////////////////
// CFolderDialog

IMPLEMENT_DYNAMIC( CFolderDialog, CDialog )

CFolderDialog::CFolderDialog( IN LPCTSTR pszTitle     /*NULL*/,
                              IN LPCTSTR pszSelPath     /*NULL*/,
                              IN CWnd*     pWndParent     /*NULL*/,
                              IN UINT     uFlags         /*BIF_RETURNONLYFSDIRS*/ )
             : CCommonDialog( pWndParent )
             , m_hWnd( NULL )
{
    ::ZeroMemory( &m_bi, sizeof( BROWSEINFO ) );
    ::ZeroMemory( m_szFolPath, MAX_PATH );
    ::ZeroMemory( m_szSelPath, MAX_PATH );
    
    // Fill data

    m_bi.hwndOwner    = pWndParent->GetSafeHwnd();
    m_bi.pidlRoot    = NULL;
    m_bi.lpszTitle    = pszTitle;
    m_bi.ulFlags    = uFlags;
    m_bi.lpfn        = (BFFCALLBACK)&BrowseCallbackProc;
    m_bi.lParam        = (LPARAM)this;

    // The size of this buffer is assumed to be MAX_PATH bytes:

    m_bi.pszDisplayName = new TCHAR[ MAX_PATH ];
    ASSERT( m_bi.pszDisplayName != NULL );

    SAFE_ZEROMEMORY(
        m_bi.pszDisplayName, ( MAX_PATH * sizeof( TCHAR ) )
    );

    if( pszSelPath )
        SetSelectedFolder( pszSelPath );
}

CFolderDialog::~CFolderDialog( VOID )
{    
    SAFE_COTASKMEMFREE( m_bi.pidlRoot );
    SAFE_DELETE2( m_bi.pszDisplayName );

    ::ZeroMemory( &m_bi, sizeof( BROWSEINFO ) );
}

BEGIN_MESSAGE_MAP( CFolderDialog, CCommonDialog )
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFolderDialog message handlers

// SetRootFolder By Jose Insa
// Microsoft knowledge Base Article
// ID Q132750: Convert a File Path to an ITEMIDLIST

BOOL CFolderDialog::SetRootFolder( IN LPCTSTR pszPath )
{
    ASSERT_VALID( this );

    if( !pszPath )
    {
        SAFE_COTASKMEMFREE( m_bi.pidlRoot );
        return TRUE;
    }

    ASSERT( AfxIsValidString( pszPath, MAX_PATH ) );

    HRESULT          hResult      = S_FALSE;
    IShellFolder* pDeskFolder = NULL;

    hResult = ::SHGetDesktopFolder( &pDeskFolder );
    if ( hResult == S_OK )
    {
        LPITEMIDLIST pidlRoot = NULL;
        LPTSTR       pszRoot  = const_cast< LPTSTR >( pszPath );

        // Convert the path to an ITEMIDLIST:
                
        USES_CONVERSION;

        hResult = pDeskFolder->ParseDisplayName(
            NULL, NULL, T2W( pszRoot ), NULL, &pidlRoot, NULL
        );

        if( hResult == S_OK )
        {
            SAFE_COTASKMEMFREE( m_bi.pidlRoot );
            m_bi.pidlRoot = pidlRoot;
        }

        SAFE_RELEASE( pDeskFolder );        
    }
    
    return ( hResult == S_OK );
}

// NOTE: pszPath buffer must be at least
// MAX_PATH characters in size:

BOOL CFolderDialog::GetRootFolder( IN OUT LPTSTR pszPath )
{
    ASSERT_VALID( this );
    ASSERT( AfxIsValidString( pszPath, MAX_PATH ) );

    return ::SHGetPathFromIDList( m_bi.pidlRoot, pszPath );
}

BOOL CFolderDialog::SetSelectedFolder( IN LPCTSTR pszPath )
{
    ASSERT( AfxIsValidString( pszPath, MAX_PATH ) );
    return (BOOL)::lstrcpy( m_szSelPath, pszPath );
}

/////////////////////////////////////////////////////////////////////////////

#if ( _MFC_VER >= 0x0700 )
    INT_PTR CFolderDialog::DoModal( VOID )
#else
    INT        CFolderDialog::DoModal( VOID )
#endif
{
    ASSERT_VALID( this );    
    ASSERT( m_bi.lpfn != NULL );
    
    INT_PTR nRet = -1;
    m_bi.hwndOwner = PreModal();

    LPITEMIDLIST pItemIDList = ::SHBrowseForFolder( &m_bi );
    if( pItemIDList )
    {
        if( ::SHGetPathFromIDList( pItemIDList, m_szFolPath ) )
            nRet = IDOK;

        SAFE_COTASKMEMFREE( pItemIDList );
    }
    else
        nRet = IDCANCEL;


    PostModal();
    return ( nRet );
}

/////////////////////////////////////////////////////////////////////////////
// Overridables:

VOID CFolderDialog::OnInitialized( VOID )
{
    if( ::lstrlen( m_szSelPath ) > 0 )
        SetSelection( m_szSelPath );
}

VOID CFolderDialog::OnSelChanged( IN LPITEMIDLIST pItemIDList )
{
    if( m_bi.ulFlags & BIF_STATUSTEXT )
    {
        TCHAR szSelFol[ MAX_PATH ] = { 0 };
        if( ::SHGetPathFromIDList( pItemIDList, szSelFol ) )
            SetStatusText( szSelFol );
    }
}

INT CFolderDialog::OnValidateFailed( IN LPCTSTR /*pszPath*/ )
{    
    ::MessageBeep( MB_ICONHAND );
    return 1; // Return 1 to leave dialog open, 0 - to end one
}

VOID CFolderDialog::OnIUnknown( IN IUnknown* /*pIUnknown*/ )
{
}

/////////////////////////////////////////////////////////////////////////////
// Callback function used with the SHBrowseForFolder function.

INT CALLBACK CFolderDialog::BrowseCallbackProc( IN HWND   hWnd,
                                                IN UINT   uMsg,
                                                IN LPARAM lParam,
                                                IN LPARAM lpData )
{
    CFolderDialog* pThis = (CFolderDialog*)lpData;
    ASSERT( pThis != NULL );

    INT nRet = 0;
    pThis->m_hWnd = hWnd;

    switch( uMsg )
    {
    case BFFM_INITIALIZED:
        pThis->OnInitialized();
        break;
    case BFFM_SELCHANGED:
        pThis->OnSelChanged( (LPITEMIDLIST)lParam );
        break;
    case BFFM_VALIDATEFAILED:
        nRet = pThis->OnValidateFailed( (LPCTSTR)lParam );
        break;
    case BFFM_IUNKNOWN:
        pThis->OnIUnknown( (IUnknown*)lParam );
        break;
    default:
        ASSERT( FALSE );
        break;
    }

    pThis->m_hWnd = NULL;
    return nRet;    
}

/////////////////////////////////////////////////////////////////////////////
// Commands, valid to call only from handlers

VOID CFolderDialog::SetExpanded( IN LPCTSTR pszPath )
{
    USES_CONVERSION;

    ASSERT( m_hWnd != NULL );
    ASSERT( AfxIsValidString( pszPath, MAX_PATH ) );

    ::SendMessage(
        m_hWnd, BFFM_SETEXPANDED,
        (WPARAM)TRUE, (LPARAM)T2CW( pszPath )
    );
}

VOID CFolderDialog::SetOKText( IN LPCTSTR pszText )
{
    USES_CONVERSION;

    ASSERT( m_hWnd != NULL );
    
    ::SendMessage(
        m_hWnd, BFFM_SETOKTEXT,
        (WPARAM)0, (LPARAM)T2CW( pszText )
    );
}

VOID CFolderDialog::EnableOK( IN BOOL bEnable /*TRUE*/ )
{
    ASSERT( m_hWnd != NULL );

    ::SendMessage(
        m_hWnd, BFFM_ENABLEOK, (WPARAM)bEnable, 0L
    );
}

VOID CFolderDialog::SetSelection( IN LPITEMIDLIST pItemIDList )
{
    ASSERT( m_hWnd != NULL );

    ::SendMessage(
        m_hWnd, BFFM_SETSELECTION,
        (WPARAM)FALSE, (LPARAM)pItemIDList
    );
}

VOID CFolderDialog::SetSelection( IN LPCTSTR pszPath )
{
    ASSERT( m_hWnd != NULL );
    ASSERT( AfxIsValidString( pszPath, MAX_PATH ) );
    
    ::SendMessage(
        m_hWnd, BFFM_SETSELECTION,
        (WPARAM)TRUE, (LPARAM)pszPath
    );
}

VOID CFolderDialog::SetStatusText( IN LPCTSTR pszText )
{
    ASSERT( m_hWnd != NULL );

    ::SendMessage(
        m_hWnd, BFFM_SETSTATUSTEXT,
        (WPARAM)0, (LPARAM)pszText
    );
}

// Shell version 5.0 or later:

VOID CFolderDialog::SetExpanded( IN LPITEMIDLIST pItemIDList )
{
    ASSERT( m_hWnd != NULL );

    ::SendMessage(
        m_hWnd, BFFM_SETEXPANDED,
        (WPARAM)FALSE, (LPARAM)pItemIDList
    );
}

/////////////////////////////////////////////////////////////////////////////


-aufruf-

C++:
...
CString tmp="";
UINT uFlags = BIF_RETURNONLYFSDIRS | BIF_USENEWUI;
CFolderDialog dlg( _T( "Titel" ), tmp, this, uFlags );
if( dlg.DoModal() == IDOK ) {
     tmp = dlg.GetFolderPath();
}
...

Dieser Post wurde am 29.03.2006 um 18:35 Uhr von mmc20 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
29.03.2006, 21:00 Uhr
xXx
Devil


mmc20
Ist ja net das du dir die Mühe gemacht hast, aber:
1. Weiß net ob du das hier so ohne weiters posten darfst...
2.
C++:
// ...
LPITEMIDLIST pItemIDList = ::SHBrowseForFolder( &m_bi );
    if( pItemIDList )
    {
    // ....



Zitat von FloSoft:

jo in der "normalen" SHBrowseForFolder-MSDN-Seite steht "Windows CE: not supported" drin...

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: