在MFC中实现“浏览文件夹”功能

假设是对标号为ID_BTN_BRS的响应,那么这个消息响应函数可能会是这样子:

void CXXClass::OnBottonBrows(void)
{ 
	//选择文件夹
	char szSelDir[MAX_PATH+1];
	memset(szSelDir,0,MAX_PATH+1);

	BROWSEINFO bi; 
	memset(&bi,0,sizeof(BROWSEINFO)); 
	bi.hwndOwner=GetSafeHwnd();   //or NULL
	bi.pszDisplayName=NULL; 
	bi.lpszTitle="请选择图片所在目录";
	bi.ulFlags=BIF_RETURNONLYFSDIRS;  /or ...

	LPITEMIDLIST ItemID; 
	ItemID=SHBrowseForFolder(&bi);    
	if(ItemID) 
	{ 
		SHGetPathFromIDList(ItemID,szSelDir);  
		GlobalFree(ItemID);   !!!
	} 
	else return;

	CString strDir;
	strDir=szSelDir;

	///寻找选定文件夹下的图片文件
	strNameList.clear();   // 已定义vector<CString> strNameList;

	WIN32_FIND_DATA fd;
	HANDLE hf;
	hf=FindFirstFile(strDir+"\\*.*",&fd);

	if(hf==INVALID_HANDLE_VALUE)  
	{
		//.....
		return;
	}

	do
	{
		//非文件夹并且是合法的文件类型(根据扩展名判断其类型)
		if((!(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY))&&
			xIsSuppImageType(fd.cFileName))
		  strNameList.push_back(strDir+"\\"+fd.cFileName);

	}while(FindNextFile(hf,&fd));

	FindClose(hf);

	nNum=strNameList.size();
	if(nNum==0)
	{
		//....
		return;
	}
	//...
}


如果只是打开或者浏览文件,比如打开avi格式视频文件,可以

char *f="视频文件(合适尺寸,低帧率,avi格式)|*avi||";

CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_FILEMUSTEXIST,f,NULL,0,TRUE);
dlg.m_ofn.lpstrTitle="打开视频";

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC打开文件和文件夹 一、利用API实现打开文件对话框和利用MFC实现打开文件对话框。 方法一:API部分: // OPENFILENAME ofn; // TCHAR szFile[MAX_PATH]; // ZeroMemory(&ofn,sizeof(ofn)); // ofn.lStructSize = sizeof(ofn); // ofn.lpstrFile = szFile; // ofn.lpstrFile[0] = TEXT('/0'); // ofn.nMaxFile = sizeof(szFile); // ofn.lpstrFilter = TEXT("all/0*.*/0jpg/0*.jpg/0bmp/0*.bmp/0"); //定义三个选项,all,text和exe // ofn.nFilterIndex = 1; //定义首选项是哪一个 // ofn.lpstrFileTitle = NULL; // ofn.nMaxFileTitle = 0; // ofn.lpstrInitialDir = NULL; // ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; // if(GetOpenFileName(&ofn)) // { // ::SetDlgItemText(this->m_hWnd,IDC_EDIT1,szFile); // } 方法二、MFC实现 // CFileDialog dlg(TRUE, NULL, NULL, // OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, // NULL); // // if(dlg.DoModal() == IDOK) // { // szFilename = dlg.GetPathName(); // ::MessageBox(NULL,szFilename,NULL,MB_OK); // } 注意:打开文件的方式和打开文件夹的方式是不同的。打开文件的方式是不断的打开直到出现末端为文件,否则遇到文件夹还要继续打开。而打开文件夹则是只要选择到一个路径的文件夹就打开。 下面的这种方式是打开文件夹MFC实现。 static TCHAR strDirName[MAX_PATH]; BROWSEINFO bi; CString szString = TEXT("选择一个源文件子文件夹"); bi.hwndOwner = ::GetFocus(); bi.pidlRoot = NULL; bi.pszDisplayName = strDirName; bi.lpszTitle = szString; bi.ulFlags = BIF_BROWSEFORCOMPUTER | BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS; bi.lpfn = NULL; bi.lParam = 0; bi.iImage = 0; LPITEMIDLIST pItemIDList = ::SHBrowseForFolder(&bi); if(pItemIDList == NULL) { return ; } ::SHGetPathFromIDList(pItemIDList, strDirName); CString str = strDirName; if(str != "" && str.Right(1) != '//') str += '//'; ::SetDlgItemText(this->m_hWnd,IDC_EDIT1,str);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值