SelectFolderDialog soll auf bestimmten Ordner springen



  • Grüße, brauche als C++ Neuling ein bisschen Hilfe.
    Ist: 1 TEdit Feld zur Ausgabe des Pfad
    1 Button zum aufrufen des FolderDialog

    Soll: Ich möchte erreichen das das aufrufen des FolderDialog zu einem bestimmten Ordner bzw. gleich in den Pfad springt welcher im EditFeld steht

    derzeit siehts so aus.
    http://prntscr.com/fscwd9

    danke schonmal



  • Das geht, soweit ich weiß, nicht. Stattdessen kannst du aber die SHBrowseForFolder Funktion aus der Windows API benutzen.



  • etwas ganz neues wollte ich nicht einbauen(dafür werden auch meine c++ kentnisse nicht reichen). ich muss mich 1000x am tag durch die pfade klicken.
    da der dialog ja den pfad an das editfeld gibt hatte ich die idee das das vielleicht auch andersrum funktioniert.
    oder das der dialog wenigsten am zuletzt aufgerufenen ordner wieder startet.

    https://www.c-plusplus.net/forum/39266 hat mir schon sehr geholfen zum verstehen. reicht aber nicht.

    keine idee?



  • Spaßvogel... die Variante benutzt SHBrowseForFolder .



  • Hallo,

    Ich habe eine leicht abgewandelte variante mit SHBrowseForFolder die eigentlich funktionieren sollte.

    bool isWin7() {
    	OSVERSIONINFOEX osvi;
    	DWORDLONG dwlConditionMask = 0;
    	int op = VER_GREATER_EQUAL;
    
    	ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
    	osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    	osvi.dwMajorVersion = 6;
    	osvi.dwMinorVersion = 1;
    	osvi.wServicePackMajor = 2;
    	osvi.wServicePackMinor = 0;
    	VER_SET_CONDITION( dwlConditionMask, VER_MAJORVERSION, op );
    	VER_SET_CONDITION( dwlConditionMask, VER_MINORVERSION, op );
    	return VerifyVersionInfo(&osvi, VER_MAJORVERSION | VER_MINORVERSION, dwlConditionMask);
    }
    
    BOOL CALLBACK FindTreeViewCallback(HWND hwnd, LPARAM lParam) {
    	char szClassName[MAX_PATH];
    	szClassName[0] = 0;
    	::GetClassName(hwnd, szClassName, sizeof(szClassName));
    	szClassName[MAX_PATH - 1] = 0;
    
    	if(lstrcmpi(szClassName, "SysTreeView32") == 0) {
    		HWND* phWnd = (HWND*)lParam;
    		if(phWnd)
    			*phWnd = hwnd;
    
    		return false;
    	}
    
    	return true;
    }
    
    int CALLBACK BrowseCallBackProc( HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData) {
    	static bool processEnsureVisible = false;
    	switch(uMsg) {
    		case BFFM_INITIALIZED: {
    			processEnsureVisible = false;
    //			const char* path = (const char*)lpData;
    
    			//In case of Windows 7 and later
    			//INFO: Correction for the Microsoft bug that doesn't
    			//      scroll the tree-view to the selected item...
    			if(isWin7()) {
    				processEnsureVisible = true;
    			}
    			::SendMessage( hwnd, BFFM_SETSELECTION, true, lpData );
    			break;
    		}
    		case BFFM_IUNKNOWN: {
    			break;
    		}
    		case BFFM_SELCHANGED: {
    			if(processEnsureVisible) {
    				processEnsureVisible = false;
    				HWND hWndTree = 0;
    				EnumChildWindows(hwnd, (WNDENUMPROC)FindTreeViewCallback, (LPARAM)&hWndTree);
    				if(hWndTree) {
    					HTREEITEM hItm = TreeView_GetSelection(hWndTree);
    					if(hItm) {
    						TreeView_EnsureVisible(hWndTree, hItm);
    					}
    				}
                }
    			break;
    		}
    	}
    	return 0;
    }
    
    bool getFolderDialog(TWinControl* parent, const std::string& titel, const IBK::Path& rootDir, IBK::Path& result) {
    	struct CoInitializer {
    		CoInitializer() {
    			CoInitialize(NULL);
    		}
    
    		~CoInitializer() {
    			CoUninitialize();
    		}
        };
    
    	CoInitializer coinit;
    	result.clear();
    
    	BROWSEINFOA info = { 0 };
    	HWND handle = parent == 0 ? HWND(0) : parent->Handle;
    	info.hwndOwner = handle;
    	info.lpszTitle = titel.c_str();
    	info.ulFlags = BIF_RETURNONLYFSDIRS | BIF_USENEWUI | BIF_NEWDIALOGSTYLE | BIF_EDITBOX;
    	std::string rootDirString = rootDir.absolutePath().osStr();
    	const char* rootPath = rootDirString.c_str();
    	info.lParam = (LPARAM)rootPath;
    	info.lpfn = BrowseCallBackProc;
    
    	//Verzeichnis anzeigen
    	LPITEMIDLIST pidl = SHBrowseForFolderA(&info);
    
    	// Id in Pfad umwandeln
    	if ( pidl != 0 ) {
    		char path[MAX_PATH] = { '\0' };
    		//get the name of the folder and put it in path
    		bool res = SHGetPathFromIDListA( pidl, path );
    
    		if( res)
    			result = path;
    
    		//free memory used
    		IMalloc * imalloc = 0;
    		if ( SUCCEEDED( SHGetMalloc ( &imalloc )) ) {
    			imalloc->Free ( pidl );
    			imalloc->Release ( );
    		}
    		return res;
    	}
    	else {
    		return false;
        }
    }
    


  • Danke für die Hilfe.
    Einen Fehler erhalte ich in Zeile 71 *Ungültige Verwendung von typedef 'TWinControl'*.



  • Musst halt noch die passenden Header-Dateien inkludieren.


Anmelden zum Antworten