【转】关于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区域显示一些信息等等。这需要在BrowseCallbackProc回调函数中实现。具体实现的源码如下:

(具体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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值