CCriticalSection cs;
CString g_strCurrDir;
void SetCurrDirForSHBrowseForFolder(const CString& strCurrDir)
{
CGuardLock<CCriticalSection> Guard(&cs);
g_strCurrDir = strCurrDir;
}
int CALLBACK FECFolderProc(HWND hWnd, UINT nMsg, LPARAM, LPARAM lpData)
{
if (BFFM_INITIALIZED == nMsg)
{
CString szPath("");
{
CGuardLock<CCriticalSection> Guard(&cs);
szPath = g_strCurrDir;
}
if (_T("") != szPath.Left(2)) // SHBrowseForFolder does not like UNC path
{
int len = szPath.GetLength() - 1;
if (2 != len && _T('//') == szPath[len])
szPath.Delete(len); // remove trailing slash (SHBrowseForFolder does not like it)
::SendMessage(hWnd, BFFM_SETSELECTION, TRUE, (LPARAM)(LPCTSTR)szPath);
}
}
return 0;
}
CString BrowseForFolderBySH(LPCTSTR lpTitle, CWnd* pWnd, CString strCurrDir)
{
BROWSEINFO BrowseDir;
LPCITEMIDLIST pIdl;
CString strFolderPath;
BrowseDir.hwndOwner = pWnd->m_hWnd;
BrowseDir.lpszTitle = lpTitle;
BrowseDir.pidlRoot = NULL;
BrowseDir.ulFlags = 0;
BrowseDir.pszDisplayName= strFolderPath.GetBuffer( MAX_PATH );
BrowseDir.lParam = (LPARAM)pWnd;
BrowseDir.lpfn = NULL;
if (!strCurrDir.IsEmpty())
{
SetCurrDirForSHBrowseForFolder(strCurrDir);
BrowseDir.lpfn = FECFolderProc;
}
pIdl = SHBrowseForFolder( &BrowseDir );
strFolderPath.ReleaseBuffer();
strFolderPath.Empty();
if ( pIdl != NULL )
{
SHGetPathFromIDList( pIdl, strFolderPath.GetBuffer( MAX_PATH ) );
strFolderPath.ReleaseBuffer();
}
return strFolderPath;
}
主要是用一个回调函数处理特定的消息。
其它例子:
http://www.codeproject.com/editctrl/fileeditctrl.asp
http://www.codeproject.com/dialog/cfolderdialog.asp