BrowseImageFiles

本文介绍了一个基于MFC的应用程序组件,该组件包括文件和目录的多选对话框。通过继承自IBrowseFile接口的两个类BrowseMultiFile和BrowseDirectory实现了文件与目录的选择功能,并能依据指定的过滤条件筛选文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//FileViewDlg.cpp
// FileViewDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "FileView.h"
#include "FileViewDlg.h"
#include "afxdialogex.h"
#include "BrowseMultiFile.h"
#include "BrowseDirectory.h"
#include <iostream>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CFileViewDlg 对话框
const std::string	CFileViewDlg::FILE_DLG_FILTERS_CONF  = "Photo Files   (*.jpg;*.gif)|*.jpg;*.gif|Bmp Files(*.bmp)|*.BMP|Icon Files(*.icon)|*.ICON|All   Files   (*.*)|*.*|| ";
CFileViewDlg::CFileViewDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CFileViewDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CFileViewDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST, m_fileListBox);
}
BEGIN_MESSAGE_MAP(CFileViewDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_FILE_OPEN, &CFileViewDlg::OnBnClickedFileOpen)
	ON_BN_CLICKED(IDC_DIR_OPEN, &CFileViewDlg::OnBnClickedDirOpen)
END_MESSAGE_MAP()
// CFileViewDlg 消息处理程序
BOOL CFileViewDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标
	// TODO: 在此添加额外的初始化代码
	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。
void CFileViewDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文
		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;
		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CFileViewDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}
void CFileViewDlg::OnBnClickedFileOpen()
{
	std::string					filter = FILE_DLG_FILTERS_CONF;
	BrowseMultiFile * pMultiFile = new BrowseMultiFile(this, filter);
	std::vector<std::string>	fileList;
	
	if (-1 == 	pMultiFile->Do(fileList))
	{
		//not find
		return;
	}
	ShowFiles(fileList);
}
void CFileViewDlg::OnBnClickedDirOpen()
{
	std::string					filters = "avi | mp4 | swp | flv";
	BrowseDirectory * pDirDialog = new BrowseDirectory(this, filters);
	std::vector<std::string>	fileList;
	
	if (-1 == pDirDialog->Do(fileList))
	{
		// not find
		return;
	}
	ShowFiles(fileList);
}
void CFileViewDlg::ShowFiles(std::vector<std::string> fileList)
{
	m_fileListBox.ResetContent();
	std::vector<std::string>::iterator	iter = fileList.begin();
	for (; iter != fileList.end(); iter++)
	{
		m_fileListBox.AddString((*iter).c_str());
	}
}

//IBrowseFile.h

#ifndef _IBROWSEFILE_H_
#define _IBROWSEFILE_H_

#include <vector>
#include <string>

class IBrowseFile {
	 
public:
	IBrowseFile(){};
	virtual ~IBrowseFile(){};

protected:
	std::string					m_filter;

public:
	virtual	int		Do(std::vector<std::string>& fileList) = 0;

	const char *	GetFilters() const {	return m_filter.empty() ? "" : m_filter.c_str();}
};

#endif /*_IBROWSEFILE_H_*/
//BrowseMultiFile.h....................''
#ifndef _BROWSE_MULTI_FILE_
#define _BROWSE_MULTI_FILE_

#include "IBrowseFile.h"

class BrowseMultiFile : public IBrowseFile
{
	
public:
	BrowseMultiFile(CWnd* pWnd, std::string & filter);
	~BrowseMultiFile();

public:
	int		Do(std::vector<std::string>& fileList);

private:
	CWnd*		m_pParent;
};

#endif /*_BROWSE_MULTI_FILE_*/



//BrowseMultiFile.cpp

#include "StdAfx.h"
#include "BrowseMultiFile.h"

BrowseMultiFile::BrowseMultiFile(CWnd* pWnd, std::string & filter)
{
	m_pParent = pWnd;
	m_filter = filter;
}

BrowseMultiFile::~BrowseMultiFile()
{
	m_filter.clear();
}

int BrowseMultiFile::Do(std::vector<std::string>& fileList)
{
	int 	ret = -1;
	ASSERT(m_pParent);
	CFileDialog		fileDlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST| OFN_HIDEREADONLY| OFN_ALLOWMULTISELECT , m_filter.c_str(), m_pParent);
	
	if(fileDlg.DoModal() == IDOK)
	{
		std::string		strfilePathName ;  
		POSITION   pos = fileDlg.GetStartPosition();
		if(pos == NULL)
		{
			return -1;
		}
		while   (pos != NULL)  
		{            
			std::string	   strfilePathName = fileDlg.GetNextPathName(pos); 
			fileList.push_back(strfilePathName);
			ret = 0;
		}
	}
	return ret;
}

//BrowseDirectory.h
#ifndef _BROWSE_DIRECTORY_
#define _BROWSE_DIRECTORY_
#include <vector>
#include <string>
#include "IBrowseFile.h"

class BrowseDirectory : public IBrowseFile
{

public:
	BrowseDirectory(CWnd* pWnd, std::string &filter);
	~BrowseDirectory();

public:
	int		Do(std::vector<std::string>& fileList);

protected:
	int	FindInFiles(std::vector<std::string>& fileList,  const std::string pathDir);
private:
	CWnd*		m_pParent;
};
#endif /*_BROWSE_DIRECTORY_*/



//BrowseDirectory.cpp

#include "StdAfx.h"
#include "BrowseDirectory.h"

BrowseDirectory::BrowseDirectory(CWnd* pWnd, std::string & filter)
{
	m_pParent = pWnd;
	m_filter = filter;
}

BrowseDirectory::~BrowseDirectory()
{
	m_filter.clear();
}

int BrowseDirectory::Do(std::vector<std::string>& fileList)
{
	char			szPath[MAX_PATH];
	CString str;   
	memset(szPath, 0, MAX_PATH);
	ASSERT(m_pParent);
	BROWSEINFO bi;   
	bi.hwndOwner = m_pParent->m_hWnd;   
	bi.pidlRoot = NULL;   
	bi.pszDisplayName = szPath;   
	bi.lpszTitle = _T("请选择目录:");   
	bi.ulFlags = 0;   
	bi.lpfn = NULL;   
	bi.lParam = 0;   
	bi.iImage = 0;   

	LPITEMIDLIST lp = SHBrowseForFolder(&bi);   

	if(lp && SHGetPathFromIDList(lp, szPath))   
	{
		return FindInFiles(fileList, szPath);
	}
	return -1;
}

int BrowseDirectory::FindInFiles(std::vector<std::string>& fileList, const std::string pathDir)
{
	if(pathDir.empty())
	{
		return -1;
	}
	int			ret = -1;
	CFileFind	fileIter;
	std::string		strFilePath = pathDir;
	std::string		strPath;

	if(strFilePath.at(strFilePath.length()-1) != '\\')
		strFilePath += "\\";
	strFilePath += "*.*";

	BOOL bRes = fileIter.FindFile(strFilePath.c_str());
	while( bRes )
	{
		bRes = fileIter.FindNextFile();
		strPath = fileIter.GetFilePath();
		if(fileIter.IsDirectory() && !fileIter.IsDots())
		{
			FindInFiles(fileList, strPath.c_str());
		}
		else if(!fileIter.IsDirectory() && !fileIter.IsDots())
		{
			//TODO: do some thing
			std::string strSuffix = strPath.substr(strPath.find_last_of('.')+1);
			if (std::string::npos != m_filter.find(strSuffix))
			{
				fileList.push_back(strPath);
				ret = 0;
			}

		}
	}
	fileIter.Close();
	return ret;
}










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值