1,目的
提供一个对话框供用户选择一个文件夹路径。
2,原理&实现
先贴上这个工具类的源码:
在你的程序中使用静态方法 CSelectFolderDlg::Show() 就能显示一个选择文件夹的对话框啦,返回的CString就是所选文件夹路径。
[cpp] view plain copy
1. /*
2. 文件:SelectFolderDlg.h
3. 说明:提供一个选择文件夹的对话框
4. */
5.
6. #ifndef SELECT_FOLDER_DLG_H
7. #define SELECT_FOLDER_DLG_H
8.
9.
10. #ifndef BIF_NEWDIALOGSTYLE
11. #define BIF_NEWDIALOGSTYLE 0x0040
12. #endif
13.
14. class CSelectFolderDlg
15. {
16. public:
17. //创建一个选择文件夹的对话框,返回所选路径
18. static CString Show()
19. {
20. TCHAR szFolderPath[MAX_PATH] = {0};
21. "");
22.
23. BROWSEINFO sInfo;
24. sizeof(BROWSEINFO));
25. sInfo.pidlRoot = 0;
26. "请选择一个文件夹:");
27. sInfo.ulFlags = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE | BIF_EDITBOX;
28. sInfo.lpfn = NULL;
29.
30. // 显示文件夹选择对话框
31. LPITEMIDLIST lpidlBrowse = ::SHBrowseForFolder(&sInfo);
32. if (lpidlBrowse != NULL)
33. {
34. // 取得文件夹名
35. if (::SHGetPathFromIDList(lpidlBrowse,szFolderPath))
36. {
37. strFolderPath = szFolderPath;
38. }
39. }
40. if(lpidlBrowse != NULL)
41. {
42. ::CoTaskMemFree(lpidlBrowse);
43. }
44.
45. return strFolderPath;
46.
47. }
48.
49. };
50.
51. #endif
简单说明下,
有个API可显示一个浏览文件夹的对话框,形式为:
LPITEMIDLIST WINAPI SHBrowseForFolder( LPBROWSEINFO lpbi);
参数就一个,这个结构定义:
[cpp] view plain copy
1. typedef struct _browseinfo {
2. HWND hwndOwner; // 父窗口句柄
3. // 要显示的文件目录对话框的根(Root)
4. LPTSTR pszDisplayName; // 保存被选取的文件夹路径的缓冲区
5. LPCTSTR lpszTitle; // 显示位于对话框左上部的标题
6. UINT ulFlags; // 指定对话框的外观和功能的标志
7. // 处理事件的回调函数
8. LPARAM lParam; // 应用程序传给回调函数的参数
9. int iImage; // 文件夹对话框的图片索引
10. } BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO
使用函数前我们建一个这个结构,填一些内容,可以对要显示的对话框做些配置:
[cpp] view plain copy
1. BROWSEINFO sInfo;
2. sizeof(BROWSEINFO));
3. sInfo.pidlRoot = 0;
4. "请选择一个文件夹:");
5. sInfo.ulFlags = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE | BIF_EDITBOX;
6. sInfo.lpfn = NULL;
这里设置了对话框显示的目录树根目录、标题、风格等。
现在就可以用它来显示一个“请选择一个文件夹”对话框了:
[cpp] view plain copy
1. // 显示文件夹选择对话框
2. LPITEMIDLIST lpidlBrowse = ::SHBrowseForFolder(&sInfo);
返回的 LPITEMIDLIST 是Windows Shell 用来唯一标识一个对象的结构,这里用它可以获取我们的路径值:
[cpp] view plain copy
1. TCHAR szFolderPath[MAX_PATH] = {0};
2. ::SHGetPathFromIDList(lpidlBrowse,szFolderPath);
3,效果
4,源码
vs2008工程下载:
http://yun.baidu.com/s/1i3wVm3z
[cpp] view plain copy
1. <pre code_snippet_id="121664" snippet_file_name="blog_20131221_3_3217985"></pre>
2. <pre></pre>
3. <pre></pre>
4. <pre></pre>
5. <pre></pre>
6.
1. <pre code_snippet_id="121664" snippet_file_name="blog_20131221_3_3217985"></pre>
2. <pre></pre>
3. <pre></pre>
4. <pre></pre>
5. <pre></pre>
6.