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