Ordnerauswahldialog



  • Hallo
    wie macht man so einen Dialog wo man einen Ordner auswählen kann?
    oder muss ich da in das WinApi forum?

    mfg burnner



  • Nein, die WinAPI Programmierer kommen zu dir 😉
    Nimm SHBrowseForFolder.



  • ok Thx! 😃
    werd's versuchen



  • BOOL BrowseForFolder(CString &ret,HWND m_hWnd)// parent hwnd
    {
    	BROWSEINFO br;
     	ZeroMemory(&br,sizeof(br));
    	br.hwndOwner=m_hWnd;
    	br.lpszTitle="Wählen Sie den Ordner !";
    	br.ulFlags=BIF_DONTGOBELOWDOMAIN|BIF_RETURNONLYFSDIRS;
    	LPITEMIDLIST itidl=SHBrowseForFolder(&br);
    	if(!itidl)
    		return FALSE;
    	char path[255];
    	SHGetPathFromIDList(itidl,path);
    	CString b;
    	b=path;
    	if(b.Right(1)=="\\")
    		ret.Format("%s",path);
    	else
    		ret.Format("%s\\",path);
    	return TRUE;
    }
    


  • @Cplusplus
    Das gibt ein Speicherleck!
    So ist's besser:

    //===========================================================================
    // BrowseCallbackProc
    //===========================================================================
    //
    //  Description:
    //    Select an initial folder
    //
    //===========================================================================
    static int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
    {
    	if(uMsg == BFFM_INITIALIZED)
    	{
    		// Path is in (LPCTSTR)lpData
    		SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData);
    	}
    	return 0;
    }
    
    //===========================================================================
    // BrowseFolder
    //===========================================================================
    //
    //  Description:
    //    Browses for a folder
    //
    //  Parameters:
    //    CString& rFolder
    //      This parameter receives the selected folder.
    //      It is also the initial folder.
    //
    //    UINT uiTitle
    //      ID of the title (will be loaded from resources)
    //
    //    CWnd* pParent = 0
    //      Parent window
    //
    //  Return value:
    //    bool
    //      true if the user clicked OK.
    //      false if the user cancelled. rFolder will remain unchanged.
    //
    //===========================================================================
    bool BrowseFolder(CString& rFolder, UINT uiTitle, CWnd* pParent)
    {
        LPITEMIDLIST pidlSelected = NULL;
        BROWSEINFO bi = {0};
    
    	// Get memory interface
    	CComPtr<IMalloc> pMalloc;
    	SHGetMalloc(&pMalloc.p);
    	ASSERT(pMalloc.p != NULL);
    	if(!pMalloc.p)
    		return false;
    
    	// Load dialog title
    	CString sTitle;
    	VERIFY(sTitle.LoadString(uiTitle));
    
    	// Set parameters for SHBrowseForFolder
        bi.hwndOwner = (pParent ? pParent : AfxGetMainWnd())->GetSafeHwnd();
        bi.pidlRoot = NULL;
        bi.pszDisplayName = NULL;
        bi.lpszTitle = sTitle;
        bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_USENEWUI;
        bi.lpfn = BrowseCallbackProc;
        bi.lParam = (LPARAM)(LPCTSTR)rFolder;
    
        pidlSelected = SHBrowseForFolder(&bi);
    
    	// SHBrowseForFolder returns NULL if the user clicked cancel
    	if(pidlSelected == NULL)
    		return false;
    
    	try
    	{
    		// Get path from IDList. The path is copied so rFolder
    		// remains unchanged if SHGetPathFromIDList fails
    		CString sFolderPath;
    		BOOL bSuccess = SHGetPathFromIDList(pidlSelected, sFolderPath.GetBuffer(2048));
    		sFolderPath.ReleaseBuffer();
    
    		// Free IDList
    		pMalloc->Free(pidlSelected);
    		pidlSelected = 0;
    
    		if(bSuccess)
    		{
    			rFolder = sFolderPath;
    			return true;
    		}
    		else
    		{
    			return false;
    		}
    	}
    	catch(...)
    	{
    		pMalloc->Free(pidlSelected);
    		throw;
    	}
    }
    


  • als erfahrener winapi-progger sach ich nur

    SHBrowseForFolder (...);



  • LUZA schrieb:

    als erfahrener winapi-progger sach ich nur

    SHBrowseForFolder (...);

    Nicht nur erfahren sondern auch saulahm, wa?



  • 😮 😮 😮

    scheisse, was habbich denn fürn ping???



  • jojo Danke euch allen



  • hmmm..
    CString x;
    BrowseFolder(x,(UINT)"hallo",0);

    Das hier gibt ein Error wen das Programm läuft...



  • burnner schrieb:

    hmmm..
    CString x;
    BrowseFolder(x,(UINT)"hallo",0);

    Der 2. Parameter der Fkt. muss die ID# des Ressources sein (String Table)



  • Ah ok..
    Funktioniert! Vielen Dank!


Anmelden zum Antworten