博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于VC弹出选择文件夹对话框
阅读量:4569 次
发布时间:2019-06-08

本文共 2779 字,大约阅读时间需要 9 分钟。

VC编程中经常需要弹出选择文件夹对话框供用户选择目标文件夹

基本实现的源码如下

1 void CTestDlg::OnBtnTest()    2 {   3     // TODO: Add your control notification handler code here   4     TCHAR pszPath[MAX_PATH];   5     BROWSEINFO bi;    6     bi.hwndOwner      = this->GetSafeHwnd();   7     bi.pidlRoot       = NULL;   8     bi.pszDisplayName = NULL;    9     bi.lpszTitle      = TEXT("请选择文件夹");   10     bi.ulFlags        = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;  11     bi.lpfn           = NULL;   12     bi.lParam         = 0;  13     bi.iImage         = 0;   14   15     LPITEMIDLIST pidl = SHBrowseForFolder(&bi);  16     if (pidl == NULL)  17     {  18         return;  19     }  20   21     if (SHGetPathFromIDList(pidl, pszPath))  22     {  23         AfxMessageBox(pszPath);  24     }  25 }

这一般均能够满足要求,但有时还是需要在此基础上增强一些功能。

比如在弹出选择文件夹对话框时选中默认的文件夹,或在STATUSTEXT区域显示一些信息等等。这需要在回调函数中实现。具体实现的源码如下:

(具体BrowseCallBackFun回调函数的用法请参照MSDN)

1 //选择文件夹对话框回调函数   2 int CALLBACK BrowseCallBackFun(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)   3 {   4     switch(uMsg)   5     {   6     case BFFM_INITIALIZED:  //选择文件夹对话框初始化   7      //设置默认路径为lpData即'D:\'   8         ::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData);   9         //在STATUSTEXT区域显示当前路径  10         ::SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, lpData);  11         //设置选择文件夹对话框的标题  12         ::SetWindowText(hwnd, TEXT("请先设置个工作目录"));   13         break;  14     case BFFM_SELCHANGED:   //选择文件夹变更时  15         {  16             TCHAR pszPath[MAX_PATH];  17             //获取当前选择路径  18             SHGetPathFromIDList((LPCITEMIDLIST)lParam, pszPath);  19             //在STATUSTEXT区域显示当前路径  20             ::SendMessage(hwnd, BFFM_SETSTATUSTEXT, TRUE, (LPARAM)pszPath);  21         }  22         break;  23     }  24     return 0;  25 }  26   28 void CTestDlg::OnBtnTest()   29 {  30     // TODO: Add your control notification handler code here  31     TCHAR pszPath[MAX_PATH];  32     BROWSEINFO bi;   33     bi.hwndOwner      = this->GetSafeHwnd();  34     bi.pidlRoot       = NULL;  35     bi.pszDisplayName = NULL;   36     bi.lpszTitle      = TEXT("请选择文件夹");   37     bi.ulFlags        = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;  38     bi.lpfn           = BrowseCallBackFun;     //回调函数  39     bi.lParam         = (LPARAM)TEXT("D:\\");  //传给回调函数的参数,设置默认路径  40     bi.iImage         = 0;   41       42     LPITEMIDLIST pidl = SHBrowseForFolder(&bi);  43     if (pidl == NULL)  44     {  45         return;  46     }  47       48     if (SHGetPathFromIDList(pidl, pszPath))  49     {  50         AfxMessageBox(pszPath);  51     }  52 }

附图片:

当然也可以设置选择文件对话框的其他样式,比如使其具有新增文件夹的功能,可如下实现

bi.ulFlags        =        BIF_USENEWUI        

附图:(改图来源于www.VCKBASE.com,本人电脑上安装的是VC6,不支持BIF_USENEWUI,请在VC2003+上尝试)

具体请参照MSDN

转载于:https://www.cnblogs.com/Hisin/archive/2012/02/27/2370614.html

你可能感兴趣的文章
Hive默认数据库修改配置
查看>>
面试之数据库面试题
查看>>
[转]基本Guava工具
查看>>
趁着没断网,赶快写总结
查看>>
Eclipse中取消按空格选中自动提示
查看>>
JAVA的Date类与Calendar类比较
查看>>
iOS开发拓展篇—音乐的播放
查看>>
Flink资料(1)-- Flink基础概念(Basic Concept)
查看>>
静态常量的问题
查看>>
cookie、 sessionStorage 、localStorage之间的区别和使用
查看>>
.Net(c#)加密解密之Aes和Des
查看>>
BZOJ 入门OJ 2004: [Noip模拟题]统计损失
查看>>
uva 11572 unique snowflakes——yhx
查看>>
二分——二分查找算法模板
查看>>
关于二次封装css selector 的复数定位
查看>>
自学C#:常用快捷键-随时补充
查看>>
[BZOJ4012] [HNOI2015]开店
查看>>
iOS5新开发的API总述——WWDC 2011
查看>>
JavaScript 基础——使用js的三种方式,js中的变量,js中的输出语句,js中的运算符;js中的分支结构...
查看>>
基于IdentityServer4的OIDC实现单点登录(SSO)原理简析
查看>>