Re: Changing selected directory
I typically remember the last folder browsed to in the registry so I can
recall it the next time I run. Then I use the SHBrowseForFolder call to
look for a new folder, if one is selected save it to my registry for future
use, then update the edit control. If you have an object wrapping
SHBrowseForFolder you could do a routine like:
void CMyDialog::OnBnClickedBrowseFolder()
{
CString csFolder, csTitle, csInitial;
csTitle.LoadString(IDS_SELECT_FOLDER);
csInitial = m_csLastFolderLocation;
if(FolderBrowser(this, csTitle, csFolder, csInitial)) {
m_csLastFolderLocation = csFolder;
// Write to registry here...
UpdateData(false); // Put in the edit control
}
}
The implementation I use for the folder browser looks like this (don't
remember where I got it, but I've been using it for many years):
//
// SetSelProc
// Callback procedure to set the initial selection of the browser.
int CALLBACK SetSelProc( HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM
lpData )
{
switch(uMsg) {
case BFFM_INITIALIZED:
{
// Set start directory
::SendMessage( hWnd, BFFM_SETSELECTION, TRUE, lpData );
// Remove the ? from the caption
DWORD dwStyle = ::GetWindowLong(hWnd, GWL_EXSTYLE);
::SetWindowLong(hWnd, GWL_EXSTYLE, dwStyle & ~WS_EX_CONTEXTHELP);
}
break;
case BFFM_SELCHANGED:
{
// Set the window text to the path
TCHAR szText[MAX_PATH] = {0};
::SHGetPathFromIDList(reinterpret_cast<LPITEMIDLIST>(lParam),
szText);
::SetWindowText(hWnd,szText);
}
break;
case BFFM_VALIDATEFAILED:
return 1; // bad folder name
}
return 0;
}
//
// FolderBrowser
// Display a SHBrowseForFolder dialog so the user can select a directory.
//
bool FolderBrowser(CWnd *pWnd, CString& csTitle, CString& csSelectedFolder,
CString &csInitialFolder, BOOL bAll, BOOL bCreate)
{
bool bWorked = false;
LPMALLOC pMalloc;
TCHAR buffer[MAX_PATH]; // Get the memory allocator
if (SUCCEEDED(::SHGetMalloc(&pMalloc))) {
// Fill in a BROWSEINFO structure
BROWSEINFO bi;
ZeroMemory(&bi,sizeof(BROWSEINFO));
bi.hwndOwner = pWnd->GetSafeHwnd();
bi.pidlRoot = NULL;
bi.pszDisplayName = NULL;
bi.lpszTitle = (LPCTSTR) csTitle;
if(!bAll)
bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS |
BIF_DONTGOBELOWDOMAIN;
else
bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;
if(bCreate)
bi.ulFlags |= BIF_NEWDIALOGSTYLE | BIF_EDITBOX;
bi.iImage = 0;
bi.lpfn = SetSelProc;
bi.lParam = (LPARAM)(LPCTSTR)csInitialFolder;
// Display the browser.
LPITEMIDLIST item_list = ::SHBrowseForFolder(&bi);
// Did we get one?
if (item_list) {
// Convert the item ID to a pathname, and copy it to the out
parameter
if (::SHGetPathFromIDList(item_list, buffer)) {
csSelectedFolder = buffer;
bWorked = true;
}
// Free the PIDL allocated by SHBrowseForFolder
pMalloc->Free(item_list);
}
pMalloc->Release();
}
return bWorked;
}
You may also have to include this in your header file if it's not found:
#ifndef BIF_NEWDIALOGSTYLE
#define BIF_NEWDIALOGSTYLE 0x0040
#endif
HTH,
Tom
"Eddards" <eddards@verizon.net> wrote in message
news:E_KdnbBiN7Xgai3XnZ2dnUVZ_hadnZ2d@giganews.com...
I am using VS6 VC++
I have a Edit Box which shows a preprogrammed directory (m_strFilesDir is
the variable)
What is the best way to change the directory with a browse button and save
that dir path for future use in m_strFilesDir?
Or maybe a control variable and not a cstring?