MFC 打开文件夹对话框
Posted
技术标签:
【中文标题】MFC 打开文件夹对话框【英文标题】:MFC Open Folder Dialog 【发布时间】:2009-10-15 03:59:10 【问题描述】:在 MFC 中,是否有打开文件夹对话框?也就是说,不是选择文件名,而是选择文件夹名称?理想情况下,我希望它是 Visual Studio 在导航“项目位置”(创建新项目时)时的方式,它看起来非常像普通的文件对话框。但如果前者不存在,我可以使用vertical tree 类型的接口之一。
【问题讨论】:
见:***.com/questions/1304784/cfiledialog-browse-folders 【参考方案1】:此代码将为您提供一个打开的文件夹对话框(这是从网络上的某个地方获取的,但我真的不知道在哪里)。
CString szSelectedFolder = _T("");
// This is the recommended way to select a directory
// in Win95 and NT4.
BROWSEINFO bi;
memset((LPVOID)&bi, 0, sizeof(bi));
TCHAR szDisplayName[_MAX_PATH];
szDisplayName[0] = '\0';
bi.hwndOwner = GetSafeHwnd();
bi.pidlRoot = NULL;
bi.pszDisplayName = szDisplayName;
bi.lpszTitle = _T("Select a folder");
bi.ulFlags = BIF_RETURNONLYFSDIRS;
// Set the callback function
bi.lpfn = BrowseCallbackProc;
LPITEMIDLIST pIIL = ::SHBrowseForFolder(&bi);
TCHAR szReturnedDir[_MAX_PATH];
BOOL bRet = ::SHGetPathFromIDList(pIIL, (TCHAR*)&szReturnedDir);
if (bRet)
if (szReturnedDir != _T(""))
szSelectedFolder = szReturnedDir;
LPMALLOC pMalloc;
HRESULT HR = SHGetMalloc(&pMalloc);
pMalloc->Free(pIIL);
pMalloc->Release();
你还必须实现这个回调函数:
TCHAR szInitialDir[_MAX_PATH];
// Set the initial path of the folder browser
int CALLBACK BrowseCallbackProc(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
// Look for BFFM_INITIALIZED
if (uMsg == BFFM_INITIALIZED)
SendMessage(hWnd, BFFM_SETSELECTION, TRUE, (LPARAM)szInitialDir);
return 0;
【讨论】:
比起memset,我更喜欢BROWSEINFO bi = 0; 这不是我所追求的,但这是我必须使用的 - 看起来没有太多工作存在替代方案。以上是关于MFC 打开文件夹对话框的主要内容,如果未能解决你的问题,请参考以下文章