关键字 定制,文件夹选择对话框,SHBrowseForFolder,文件夹选择,目录选择
原作者姓名 张增强

介绍
Displays a dialog box that enables the user to select a shell folder.

读者评分 3 评分次数 1

正文
1、API概述
     使用Windows的SHBrowseForFolder可以实现目录选择功能。
     该函数的参数也实现如下:见MSDN
     Displays a dialog box that enables the user to select a shell folder.
     LPITEMIDLIST SHBrowseForFolder(LPBROWSEINFO lpbi);
   Returns a pointer to an ITEMIDLIST structure (PIDL) that specifies the location of the selected folder relative to the root of the namespace. If the user chooses the Cancel button in the dialog box, the return value is NULL.

2、使用
     #define REMOVE_HEIGHT 28
     //   回调函数的声明
     int CALLBACK _SHBrowseForFolderCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData);

BOOL SelectFolder(CString& lpstrFolderPos, CString strInitPosition)
     {
         BOOL           bRes = FALSE;

char           lpszPath[MAX_PATH];
         LPMALLOC       lpMalloc;
         BROWSEINFO     sInfo;
         LPITEMIDLIST lpidlBrowse;

if (::SHGetMalloc(&lpMalloc) != NOERROR)
             return FALSE;

if (strInitFolder != _T(""))
         {
             if(strInitFolder.Right(1) == _T("\\"))                           // 删除尾部的"\\"
             strInitFolder = strInitFolder.Left(strInitFolder.GetLength() - 1);
         }

::ZeroMemory(&sInfo, sizeof(BROWSEINFO));
         sInfo.pidlRoot   = 0;
         sInfo.pszDisplayName = lpszPath;
         sInfo.lpszTitle   = _T("请选择您需要的目的文件:");
         sInfo.ulFlags   = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE | BIF_USENEWUI;

sInfo.lpfn     = _SHBrowseForFolderCallbackProc;
         sInfo.lParam   = (LPARAM)strInitFolder.GetBuffer(0);

// 显示文件选择对话
         lpidlBrowse = ::SHBrowseForFolder(&sInfo);

if (lpidlBrowse != NULL)
         {
             // 取得文件
             if (::SHGetPathFromIDList(lpidlBrowse,lpszPath))  
             {
                 lpstrFolder = _T("");
                 lpstrFolder = lpszPath;
  
                 if(lpstrFolder != "")
                 {
                     if(lpstrFolder.Right(1) != _T("\\"))
                         lpstrFolder += _T("\\");               //在末尾时附加"\\"
                 }
             }
  
             bRes = TRUE;
         }

if(lpidlBrowse != NULL)
         {
             ::CoTaskMemFree(lpidlBrowse);
         }

lpMalloc->Release();

return bRes;
     }

下面是回调函数,以及函数的处理
     int CALLBACK _SHBrowseForFolderCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
     {
         static HWND hWndEdit = NULL;
         CString strDir;

switch (uMsg)
         {
         case BFFM_INITIALIZED:
             {
                 ::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData);
  
                 CRect rect;  
                 HWND   hChild = GetWindow(hwnd, GW_CHILD);
                 while (hChild)
                 {
                     TCHAR szClass[256];
                     GetClassName(hChild, szClass, 255);
                   //   如果是中间的树目录控件,使可以随窗口移动大小
                     if (strcmp(szClass, "SHBrowseForFolder ShellNameSpace Control") == 0)
                     {
                         GetWindowRect(hChild, rect);
                         rect.top -= REMOVE_HEIGHT;

CPoint pt = rect.TopLeft();
                         ScreenToClient(hwnd, &pt);
                         MoveWindow(hChild, pt.x, pt.y, rect.Width(), rect.Height(), TRUE);
                     }

if (strcmp(szClass, "Edit") == 0)
                     {
                         hWndEdit = hChild;
                     }
    
                     hChild = GetNextWindow(hChild, GW_HWNDNEXT);
                 }

SetWindowText(hwnd, "alinx文件浏览...");
             }
             break;
  
         case BFFM_SELCHANGED:
             if(hWndEdit)
             {
                 if(::SHGetPathFromIDList((LPITEMIDLIST)lParam, strDir.GetBufferSetLength(MAX_PATH)))
                 {
                     SetWindowText(hWndEdit, strDir);
                 }
                 else
                 {
                     SetWindowText(hWndEdit, NULL);
                     SendMessage(hwnd, BFFM_VALIDATEFAILED, 0, 0);
                 }
               strDir.ReleaseBuffer();
             }
             break;
  
         default:
             break;
  
         }

return 0;
     }

3、效果
    

另一应用实例

#ifndef GLOBAL_H
#define GLOBAL_H

#ifndef BIF_NEWDIALOGSTYLE
#define   BIF_NEWDIALOGSTYLE   0x0040
#endif

#ifndef BIF_USENEWUI
#define   BIF_USENEWUI    0x0050
#endif

// 初始化文件设定用的回调函数
int CALLBACK _SHBrowseForFolderCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
if(uMsg == BFFM_INITIALIZED)
   ::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData);

return 0;
}

bool g_fSelectFolderDlg(CString* lpstrFolder,CString strIniFolder,bool bAvailNewFolder)
{
bool    ret;
char    lpszPath[MAX_PATH];
LPMALLOC   lpMalloc;
BROWSEINFO   sInfo;
LPITEMIDLIST lpidlRoot;
LPITEMIDLIST lpidlBrowse;

if(lpstrFolder == NULL)
   return false;

if(::SHGetMalloc(&lpMalloc) != NOERROR)
   return false;

ret = false;

if(strIniFolder != "")
{
   if(strIniFolder.Right(1) == "\\")
    strIniFolder = strIniFolder.Left(strIniFolder.GetLength() - 1);    //删除末尾的"\\"
  
}

::SHGetSpecialFolderLocation(NULL, CSIDL_DRIVES, &lpidlRoot); //取得选定的文件

::ZeroMemory(&sInfo, sizeof(BROWSEINFO));
sInfo.pidlRoot   = lpidlRoot;
sInfo.pszDisplayName = lpszPath;
sInfo.lpszTitle   = _T("Please Select Work Directory:");
sInfo.ulFlags   = BIF_RETURNONLYFSDIRS;
if(bAvailNewFolder == true)
   sInfo.ulFlags |= BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_USENEWUI;
sInfo.lpfn    = _SHBrowseForFolderCallbackProc;
sInfo.lParam   = (LPARAM)strIniFolder.GetBuffer(0);

lpidlBrowse = ::SHBrowseForFolder(&sInfo);    //显示文件选择对话

if(lpidlBrowse != NULL)
{
   if(::SHGetPathFromIDList(lpidlBrowse,lpszPath)) //取得文件名  
   {
    *lpstrFolder = "";
    *lpstrFolder = lpszPath;
   
    if(*lpstrFolder != "")
    {
     if(lpstrFolder->Right(1) != "\\")
      *lpstrFolder += "\\";     //在末尾时附加"\\"
    }
   }
  
   ret = true;
}

if(lpidlBrowse != NULL)
   ::CoTaskMemFree(lpidlBrowse);
if(lpidlRoot != NULL)
   ::CoTaskMemFree(lpidlRoot);

lpMalloc->Release();

return ret;
}

#endif

调用:

void CSelectDir::OnButton1()
{
// TODO: Add your control notification handler code here
if(g_fSelectFolderDlg(&m_strFolder,m_strFolder,false))
{
   UpdateData(false);
}
}

转载于:https://www.cnblogs.com/alecdu/archive/2008/10/10/1308326.html

vc文件夹选择对话框相关推荐

  1. 文件夹选择对话框 JS实现(转)

    /** * browseFolder.js * 该文件定义了BrowseFolder()函数,它将提供一个文件夹选择对话框 * 以供用户实现对系统文件夹选择的功能 * 文件夹选择对话框起始目录由 * ...

  2. 文件夹选择对话框 JS实现的两种方案

    文件夹选择对话框 JS实现的两种方案 /**  * browseFolder.js  * 该文件定义了BrowseFolder()函数,它将提供一个文件夹选择对话框  * 以供用户实现对系统文件夹选择 ...

  3. 弹出文件夹选择对话框

    不多说了,直接贴出函数: /// // 功能:弹出一个文件夹选择对话框 // 返回:用户选择的文件夹路径 // CString GetSavePath() {#define BIF_NEWDIALOG ...

  4. MFC打开文件夹选择对话框

    函数名:OnBnClickedButtonDir 函数功能:通过点击按钮,弹出打开文件夹选择对话框 参数:无 返回值:无 额外说明: ulFlags标志位说明: BIF_BROWSEFORCOMPUT ...

  5. Bat调用/弹出文件或文件夹选择对话框

    弹出文件夹选择框 @echo off rem 弹出文件夹浏览选择对话框 set #=Any question&set @=WX&set $=Q&set/az=0x53b7e0b ...

  6. 十三、PyQt5的QFileDialog文件打开、文件保存、文件夹选择对话框

    import PyQt5.QtCore,PyQt5.QtGui # 获取文件路径对话框 file_name = QFileDialog.getOpenFileName(self,"打开文件& ...

  7. Windows批处理文件/文件夹选择器对话框

    Windows批处理脚本的文件/文件夹选择器对话框 前言 一.问题描述 二.推荐答案 1.文件浏览器 2.文件夹浏览器 3.其他推荐答案 总结 前言 本文是小编为大家收集整理的关于来自Windows批 ...

  8. 弹出选择文件夹的对话框 BROWSEINFO 的用法【MFC】

    以下是在vs2008中编译通过的代码,代码注释详细.要实现的功能是点击"浏览"按钮,即弹出选择文件夹的对话框.并将选择的文件夹或文件路径显示在MessageBox中. void C ...

  9. Python 文本对话框提示框 + 文件夹选择框 如何实现

    Python 文本对话框提示框: messagebox.showinfo("提示","你好,我是提示框") Python 文件夹选择框: foldr_patch ...

最新文章

  1. asp.net panel 加html,ASP.NET 页面中动态增加的控件、添加事件
  2. 【路由交换实验】生成树STP(stp,rstp,mstp)
  3. 巧用css实现强制不换行、自动换行、强制换行(转)
  4. OxyPlot.Wpf 图表控件使用备忘
  5. 太阳能电池基本特性实验报告_太阳能电池基本特性研究实验报告的数据处理Ini怎么?太阳能电池基 爱问知识人...
  6. 【PDF】处理pdf 文档的相关功能包总结
  7. form data和request payload的区别
  8. 人脸表情识别从0到部署,猜猜『轮到你了』的微笑狼人到底是谁!
  9. freeswitch录音功能
  10. Android opencv 检测屏幕是否有坏点/检测一个颜色是否有杂点
  11. RFID室内定位技术原理浅析-RFID室内人员定位-新导智能
  12. 3dmax中如何解决镜头穿透模型?
  13. 分享解决方法:为什么QQ聊天框中无法使用输入法输入中文?
  14. [CVPR2021]NeRV: Neural Reflectance and Visibility Fields for Relighting and View Synthesis
  15. h5难做吗_这样的h5制作难吗,通过什么平台可以做出来?
  16. iPhone手机拍的图片为什么电脑上打不开?秒懂
  17. Beacon API的应用
  18. jQuery制作tab选项卡
  19. 根据工作日/节假日收货要求计算预计发货时间
  20. 药品市场信息查询-药品数据库(全面)

热门文章

  1. 阿伏法机器人_知识与技能 (1)知道机器人的相关知识. (2)理解模块机器人的构成以及各个模块的作用. (3)知道模块电路及其组合方式. (4)初步学会组装和操作模块机器人....
  2. 求两条轨迹间的hausdorff距离_自动控制原理 | 根轨迹法
  3. Android Studio安装应用时报错 installation failed with message Failed to finalize session......
  4. 每天一道LeetCode-----给定序列中2/3/4个元素的和为target的所有集合,或3个元素的和最接近target的集合
  5. HTML字体小于12谷歌不兼容,Chrome谷歌浏览器下不支持css字体小于12px的解决办法【原创】...
  6. elementui在vue校验表单失效的原因之一(当表单含有一到多个对象)
  7. can协议解析字符串的原理
  8. 小腿训练三部曲之(三)
  9. numpy高级操作,求高维矩阵的距离矩阵(方阵)以及 求某一个维度的累加和 , 矩阵切片操作
  10. 神经网络基础_反向传播_证明