1. 弹出目录或文件选择对话框
2. 当选中目录时将该目录下所有.c文件的绝对路径获取出来
3. 当选中文件时,判断是否是.c文件,如果是.c文件将该.c文件绝对路径获取出来
4. 支持多选目录
5. 支持多选文件
6. 支持文件与目录混选模式,且支持多选
下面我面先看一下一般目录选择和文件选择是怎么实现的吧:
#include <wtypes.h>
#include <atlbase.h>
#include <shlobj.h>
#include <iostream>
using namespace std;
//显示文件夹浏览对话框
//用shell提供的SHBrowseForFolder,需要一个指向BROWSEINFO结构的指针
/*
BROWSEINFO结构:
HWND hwndOwner,指定对话框的父窗口的句柄
LPCITEMIDLIST pidlRoot,指定打开浏览的根目录,若为NULL,表示桌面
LPSTR pszDisplayName,指定一个缓冲区,接收用户选择的目录的显示名称
LPCSTR lpszTitle,树形视图上方显示的文字
UINT ulFlags,指定属性
BFFCALLBACK Lpfn,指定回调函数,发生某些事件时,指定的函数被调用,允许程序进一步定制对话框的行为
LPARAM lParam,若指定回调函数,参数值传递给回调函数
int iImage,代表用户选择的文件夹对象的图标在系统图标列表中的索引
*/
int main()
{
BROWSEINFO bi;
::ZeroMemory(&bi,sizeof(bi)); //将bi结构清零
char szSelPath[MAX_PATH]; //被选择文件夹对象名称的缓冲区
bi.pszDisplayName=szSelPath;
LPITEMIDLIST pNetHoodIDL;
::SHGetSpecialFolderLocation(NULL,CSIDL_HISTORY,&pNetHoodIDL); //根文件夹为历史文件夹
bi.pidlRoot=pNetHoodIDL; bi.lpszTitle="zengwenwu "; //提示字符串
bi.ulFlags=BIF_BROWSEINCLUDEFILES| //允许选择文件对象
BIF_EDITBOX| //显示编辑框
BIF_STATUSTEXT| //显示状态文本
BIF_VALIDATE; //校验编辑框中的输入
LPITEMIDLIST pidlSel=::SHBrowseForFolder(&bi); //打开文件夹浏览对话框
if(pidlSel!=NULL)
{
cout<<"Selected:"<<szSelPath<<endl;
CComPtr<IMalloc> pMalloc;
::SHGetMalloc(&pMalloc);
pMalloc->Free(pidlSel); //释放资源
}
return 0;
}
//选择目录按钮
void CDcPackerDlg::OnBnClickedDecgen()
{
char szPath[MAX_PATH]; //存放选择的目录路径
CString str;
ZeroMemory(szPath, sizeof(szPath));
BROWSEINFO bi;
bi.hwndOwner = m_hWnd;
bi.pidlRoot = NULL;
bi.pszDisplayName = szPath;
bi.lpszTitle = "请选择需要打包的目录:";
bi.ulFlags = 0;
bi.lpfn = NULL;
bi.lParam = 0;
bi.iImage = 0;
//弹出选择目录对话框
LPITEMIDLIST lp = SHBrowseForFolder(&bi);
if(lp && SHGetPathFromIDList(lp, szPath))
{
str.Format("选择的目录为 %s", szPath);
AfxMessageBox(str);
}
else
AfxMessageBox("无效的目录,请重新选择");
}
//选择文件对话框
CString CDcPackerDlg::BootOpenDialog() //返回选择的文件名称
{
CString strFile = _T("");
CFileDialog dlgFile(TRUE, NULL, NULL, OFN_HIDEREADONLY, _T("Describe Files (*.cfg)|*.cfg|All Files (*.*)|*.*||"), NULL);
if (dlgFile.DoModal())
{
strFile = dlgFile.GetPathName();
}
return strFile;
}
//加载文件按钮
void CDcPackerDlg::OnBnClickedSelectdec()
{
// TODO: Add your control notification handler code here
m_strDescPath = ""; //类的成员变量
//"打开文件"对话框,选择文件,返回其路径
m_strDescPath = BootOpenDialog();
}