[MFC]目录选择与文件选择

22 篇文章 0 订阅
13 篇文章 1 订阅


最近项目中有下面需求:

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();
	
    
}


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值