VC中没有现成的函数来选择一个文件夹,但这是经常会用到的,怎么办?
自动动手,丰衣足食!

使用SHBrowseForFolder,代码如下:

#include 
  
int SelFolder(HWND hParent, CString &strFolder)
{
    strFolder.Empty();
 
    LPMALLOC lpMalloc;
 
    if (::SHGetMalloc(&lpMalloc) != NOERROR) return 0;
 
    char szDisplayName[_MAX_PATH];
    char szBuffer[_MAX_PATH];
    BROWSEINFO browseInfo;
    browseInfo.hwndOwner = hParent;
    browseInfo.pidlRoot = NULL; // set root at Desktop
    browseInfo.pszDisplayName = szDisplayName;
    browseInfo.lpszTitle = "Select a folder";
    browseInfo.ulFlags = BIF_RETURNFSANCESTORS|BIF_RETURNONLYFSDIRS;
    browseInfo.lpfn = NULL;
    browseInfo.lParam = 0;
 
    LPITEMIDLIST lpItemIDList;
    if ((lpItemIDList = ::SHBrowseForFolder(&browseInfo)) != NULL)
    {
        // Get the path of the selected folder from the    item ID list.
        if (::SHGetPathFromIDList(lpItemIDList, szBuffer))
        {
            // At this point, szBuffer contains the path the user chose.
            if (szBuffer[0] == ´\0´) return 0;
 
            // We have a path in szBuffer! Return it.
            strFolder = szBuffer;
            return 1;
        }
        else return 1; // strResult is empty
 
        lpMalloc->Free(lpItemIDList);
        lpMalloc->Release();
    }
    
 return 1;
}

//////调用:

void CMusic1Dlg::OnOK() 
{
 // TODO: Add extra validation here
 CString str;

HWND m_hWnd = GetSafeHwnd(); 
 
 SelFolder(m_hWnd,str);

m_list.AddString(str);
// CDialog::OnOK();
}

//------------------------------------------------------------------------------------------------------

//_________________________________________________________________

“选择文件夹”对话框的封装

我们经常需要用到“选择文件夹”对话框,相应的API已经很好用,但稍嫌麻烦,所以我专门将其封装了一下,力求一步到位。

函数封装如下:
/*****************************************************************
** 函数名:GetPath
** 输 入: 无
** 输 出: CString strPath
**        strPath非空, 表示用户选择的文件夹路径
**        strPath为空, 表示用户点击了“取消”键,取消选择
** 功能描述:显示“选择文件夹”对话框,让用户选择文件夹
****************************************************************/

CString GetPath()
{
 CString strPath = "";
 BROWSEINFO bInfo;
 ZeroMemory(&bInfo, sizeof(bInfo));
 bInfo.hwndOwner = m_hWnd;
 bInfo.lpszTitle = _T("请选择路径: ");
 bInfo.ulFlags = BIF_RETURNONLYFSDIRS;    
 
 LPITEMIDLIST lpDlist; //用来保存返回信息的IDList
 lpDlist = SHBrowseForFolder(&bInfo) ; //显示选择对话框
 if(lpDlist != NULL)  //用户按了确定按钮
 {
  TCHAR chPath[255]; //用来存储路径的字符串
  SHGetPathFromIDList(lpDlist, chPath);//把项目标识列表转化成字符串
  strPath = chPath; //将TCHAR类型的字符串转换为CString类型的字符串
 }
 return strPath;
}

调用时只需要用到以下代码:
CString strPath = GetPath();
则strPath为用户选择的文件夹路径。如果用户点击了对话框的取消键,则strPath为空字符串("");

最新文章

  1. 判断是否安装APP
  2. RX(一)
  3. angular.element的常用方法
  4. TweenMax_API介绍
  5. java整数类型
  6. python 捕获 shell 脚本的输出结果
  7. Meta也很强
  8. 【ZZ】超全面的设计模式总结
  9. ArcGIS Runtime for Android开发教程V2.0(2)开发环境配置
  10. SGU 280.Trade centers(贪心)
  11. 用Global.asax实现伪静态.
  12. PowerShell 字符串操作符
  13. Code Complete阅读笔记(一)
  14. nRF51800 蓝牙学习 进程记录 2:关于二维数组 执念执战
  15. Taro父子组件通信
  16. Oracle树查询及相关函数
  17. hadoop配置项笔记 - streaming
  18. Windows Server 2016 + SCO 2016 安装及配置介绍
  19. python 模块大全
  20. 在Vue项目中使用vw实现移动端适配

热门文章

  1. 在intent-filter中的配置
  2. Fzu软工第一次作业-准备篇
  3. C#/.NET 使用 CommandLineParser 来标准化地解析命令行
  4. unicode汉字编码
  5. L3-018 森森美图 (30 分)
  6. SQL Server中如何实现遍历表的记录
  7. Win8被禁购信息战由暗到明
  8. Oracle密码过期处理
  9. mysql常用的聚合函数
  10. Mysql监控调优