1,目的

提供一个对话框供用户选择一个文件夹路径。

2,原理&实现

先贴上这个工具类的源码:

在你的程序中使用静态方法 CSelectFolderDlg::Show() 就能显示一个选择文件夹的对话框啦,返回的CString就是所选文件夹路径。

  1. /*
  2. 文件:SelectFolderDlg.h
  3. 说明:提供一个选择文件夹的对话框
  4. */
  5. #ifndef SELECT_FOLDER_DLG_H
  6. #define SELECT_FOLDER_DLG_H
  7. #ifndef BIF_NEWDIALOGSTYLE
  8. #define  BIF_NEWDIALOGSTYLE  0x0040
  9. #endif
  10. class CSelectFolderDlg
  11. {
  12. public:
  13. //创建一个选择文件夹的对话框,返回所选路径
  14. static CString Show()
  15. {
  16. TCHAR           szFolderPath[MAX_PATH] = {0};
  17. CString         strFolderPath = TEXT("");
  18. BROWSEINFO      sInfo;
  19. ::ZeroMemory(&sInfo, sizeof(BROWSEINFO));
  20. sInfo.pidlRoot   = 0;
  21. sInfo.lpszTitle   = _T("请选择一个文件夹:");
  22. sInfo.ulFlags   = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE | BIF_EDITBOX;
  23. sInfo.lpfn     = NULL;
  24. // 显示文件夹选择对话框
  25. LPITEMIDLIST lpidlBrowse = ::SHBrowseForFolder(&sInfo);
  26. if (lpidlBrowse != NULL)
  27. {
  28. // 取得文件夹名
  29. if (::SHGetPathFromIDList(lpidlBrowse,szFolderPath))
  30. {
  31. strFolderPath = szFolderPath;
  32. }
  33. }
  34. if(lpidlBrowse != NULL)
  35. {
  36. ::CoTaskMemFree(lpidlBrowse);
  37. }
  38. return strFolderPath;
  39. }
  40. };
  41. #endif

简单说明下,

有个API可显示一个浏览文件夹的对话框,形式为:

LPITEMIDLIST WINAPI SHBrowseForFolder( LPBROWSEINFO lpbi);

参数就一个,这个结构定义:

  1. typedef struct _browseinfo {
  2. HWND hwndOwner;            // 父窗口句柄
  3. LPCITEMIDLIST pidlRoot;    // 要显示的文件目录对话框的根(Root)
  4. LPTSTR pszDisplayName;     // 保存被选取的文件夹路径的缓冲区
  5. LPCTSTR lpszTitle;         // 显示位于对话框左上部的标题
  6. UINT ulFlags;              // 指定对话框的外观和功能的标志
  7. BFFCALLBACK lpfn;          // 处理事件的回调函数
  8. LPARAM lParam;             // 应用程序传给回调函数的参数
  9. int iImage;                // 文件夹对话框的图片索引
  10. } BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO

使用函数前我们建一个这个结构,填一些内容,可以对要显示的对话框做些配置:

  1. BROWSEINFO sInfo;
  2. ::ZeroMemory(&sInfo, sizeof(BROWSEINFO));
  3. sInfo.pidlRoot   = 0;
  4. sInfo.lpszTitle   = _T("请选择一个文件夹:");
  5. sInfo.ulFlags   = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE | BIF_EDITBOX;
  6. sInfo.lpfn     = NULL;

这里设置了对话框显示的目录树根目录、标题、风格等。
现在就可以用它来显示一个“请选择一个文件夹”对话框了:

  1. // 显示文件夹选择对话框
  2. LPITEMIDLIST lpidlBrowse = ::SHBrowseForFolder(&sInfo);

返回的 LPITEMIDLIST 是Windows Shell 用来唯一标识一个对象的结构,这里用它可以获取我们的路径值:

  1. TCHAR szFolderPath[MAX_PATH] = {0};
  2. ::SHGetPathFromIDList(lpidlBrowse,szFolderPath);

3,效果

4,源码

vs2008工程下载:

http://yun.baidu.com/s/1i3wVm3z

    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>

c++选择文件夹对话框的更多相关文章

  1. Delphi 弹出Windows风格的选择文件夹对话框, 还可以新建文件夹

    Delphi 弹出Windows风格的选择文件夹对话框, 还可以新建文件夹     unit Unit2; interface uses  Windows, Messages, SysUtils, V ...

  2. java 选择文件夹对话框

    java swing 选择文件夹对话框 import java.io.File; import javax.swing.JFileChooser; public class Test2 { publi ...

  3. winform 实现选择文件和选择文件夹对话框

    //选择文件,点击[浏览],选择文件 private void button1_Click(object sender, EventArgs e) { OpenFileDialog openFileD ...

  4. NX二次开发-弹出选择文件夹对话框

    这个UFUN和NOPEN里没有对应的函数和类,要用C++的方法去做. #include "afxdialogex.h"//弹出选择文件夹对话框头文件 #include " ...

  5. MFC中打开选择文件夹对话框,并将选中的文件夹地址显示在编辑框中

    一般用于选择你要将文件保存到那个目录下,此程序还包含新建文件夹功能 BROWSEINFO bi; ZeroMemory(&bi, sizeof(BROWSEINFO));  //指定存放文件的 ...

  6. NX二次开发-UFUN打开选择文件夹对话框UF_UI_create_filebox

    #include <uf.h> #include <uf_ui.h> #include <string> using namespace std; string O ...

  7. CodeSmith使用总结--下拉列表和文件夹对话框属性

    上一篇有点短了,因为实在没有什么可说的,这一篇会多一点.O(∩_∩)O~ 一.下拉列表 关于如何在CodeSmith中创建一个下拉列表的属性框其实很简单,是要使用C#中的枚举就行了,看操作. 首先定义 ...

  8. VBA文件对话框的应用(VBA打开文件、VBA选择文件、VBA选择文件夹)

    在VBA中经常要用到文件对话框来进行打开文件.选择文件或选择文件夹的操作.用Microsoft Office提供的文件对话框比较方便.用法如下Application.FileDialog(fileDi ...

  9. mfc--弹出文件夹对话框

    1. HRESULT CoInitializeEx(void* pvReserved,DWORD dwCoInit) 初始化com组件,传递参数COINIT_APARTMENTTHREADED 2.L ...

随机推荐

  1. Manthan, Codefest 16 F

    寻找树上最大权值和的两条不相交的路径. 树形DP题.挺难的,对于我…… 定义三个变量ma[MAXN], t[MAXN], sum[MAXN] 其中,ma[i]代表i子树中,最长的路径和 t[i]代表i ...

  2. PL/SQL个人学习笔记

    资料1 -- Created on 2014/8/20  declare    -- Local variables here   i integer; begin   i := 12;   -- T ...

  3. UIViewController 专题

    呵呵 轻轻巧巧    UIViewController self setNeedsStatusBarAppearanceUpdate 刷新状态栏 (内部会重新调用 prefersStatusBarHi ...

  4. Redis缓存数据库安全加固指导(一)

    背景 在众多开源缓存技术中,Redis无疑是目前功能最为强大,应用最多的缓存技术之一,参考2018年国外数据库技术权威网站DB-Engines关于key-value数据库流行度排名,Redis暂列第一 ...

  5. bzoj1227

    离散化+树状数组+排列组合 很久以前就看到过这道题,现在依然不会做...看完题解发现思路很简单,就是有点难写 我们先将坐标离散化,x和y最大是w,然后我们就有了一个暴力做法, 枚举每块墓地,统计,因为 ...

  6. bzoj4821

    线段树 这题真是无聊 把式子拆开,然后可知维护xi,yi,xi^2,xi*yi,重点在于标记下传,当我们进行2号操作时,直接累加进答案和标记即可,进行3号操作时,update时先把自己这层赋值成要改变 ...

  7. jQuery的jsop,jsonp跨域请求

    https://www.cnblogs.com/chiangchou/p/jsonp.html

  8. Tyvj1305最大子序和(单调队列优化dp)

    描述 输入一个长度为n的整数序列,从中找出一段不超过M的连续子序列,使得整个序列的和最大. 例如 1,-3,5,1,-2,3 当m=4时,S=5+1-2+3=7当m=2或m=3时,S=5+1=6 输入 ...

  9. [Swift通天遁地]二、表格表单-(16)在表单行内嵌入日期和时间拾取器

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  10. [Swift通天遁地]四、网络和线程-(5)解析网络请求数据:String(字符串)、Data(二进制数据)和JSON数据

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...