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