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,效果

JFileChooser文件夹选择 选择文件路径_JFileChooser文件夹选择

JFileChooser文件夹选择 选择文件路径_#define_02


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.