zoukankan      html  css  js  c++  java
  • c++选择文件夹对话框

    1,目的

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

    2,原理&实现

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

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

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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.         CString         strFolderPath = TEXT("");  
    22.           
    23.         BROWSEINFO      sInfo;  
    24.         ::ZeroMemory(&sInfo, sizeof(BROWSEINFO));  
    25.         sInfo.pidlRoot   = 0;  
    26.         sInfo.lpszTitle   = _T("请选择一个文件夹:");  
    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 plaincopy在CODE上查看代码片派生到我的代码片
     
    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  

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

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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;  


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

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. // 显示文件夹选择对话框  
    2.         LPITEMIDLIST lpidlBrowse = ::SHBrowseForFolder(&sInfo);   

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

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. TCHAR szFolderPath[MAX_PATH] = {0};  
    2. ::SHGetPathFromIDList(lpidlBrowse,szFolderPath);  



    3,效果

    4,源码

    vs2008工程下载:

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

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
      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.      
  • 相关阅读:
    Java Iterator模式
    .NET中的异常和异常处理
    .NET 中的DateTime
    .NET中的StringBuilder
    .NET中的计时器控件Timer
    .NET中的字符串你了解多少?
    必须会的SQL语句(八)数据库的完整性约束
    必须会的SQL语句(七)字符串函数、时间函数
    必须会的SQL语句(六)查询
    必须会的SQL语句(五)NULL数据处理和类型转换
  • 原文地址:https://www.cnblogs.com/xzh1993/p/5048018.html
Copyright © 2011-2022 走看看