用C++实现MFC对话框:提供选择录功能,让用户选择需要查找的目标文件夹。 提供文件名 EditBox,接收用户输入的文件名,支持按回车或点击查找按钮触发查找操作。 支持部分匹配或全字匹配选项,支持是否查找子目录和是否包含文件夹名,其中部分匹配、包含子目录、不查找文件央名为默认选项。 列表按照文件全路径排序,表格支持点击表头进行排序。 支持热键触发按钮和选项。 记录历史选项和输入的文件名,再次打开对话框时自动加载上一次的历史。 如果没有历史记录,则路径名默认为当前目录。
时间: 2024-02-22 22:00:29 浏览: 48
MFC实现的可以选择文件夹功能
4星 · 用户满意度95%
好的,以下是实现MFC对话框的代码:
首先,在对话框资源中添加控件,包括一个编辑框、一个选择文件夹按钮、一个“查找”按钮、多个复选框和一个列表框。
在对话框类头文件中添加以下代码:
```
class CMyDlg : public CDialogEx
{
// ...
private:
CString m_strFolderPath; // 保存选择的文件夹路径
CString m_strFileName; // 保存输入的文件名
BOOL m_bPartialMatch; // 部分匹配选项
BOOL m_bSearchSubDir; // 是否查找子目录选项
BOOL m_bIncludeFolder; // 是否包含文件夹名选项
CListCtrl m_lstResult; // 显示查找结果的列表框
// 私有成员函数
void DoSearch(); // 执行查找操作
void LoadHistory(); // 加载历史记录
void SaveHistory(); // 保存历史记录
};
```
在对话框类的实现文件中添加以下代码:
```
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT_FILENAME, m_strFileName);
DDX_Control(pDX, IDC_LIST_RESULT, m_lstResult);
DDX_Check(pDX, IDC_CHECK_PARTIAL, m_bPartialMatch);
DDX_Check(pDX, IDC_CHECK_SUBDIR, m_bSearchSubDir);
DDX_Check(pDX, IDC_CHECK_FOLDER, m_bIncludeFolder);
}
BOOL CMyDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 加载历史记录
LoadHistory();
// 设置列表框风格
m_lstResult.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
// 添加列表框列头
m_lstResult.InsertColumn(0, _T("文件名"), LVCFMT_LEFT, 300);
m_lstResult.InsertColumn(1, _T("路径"), LVCFMT_LEFT, 500);
return TRUE;
}
void CMyDlg::OnBnClickedButtonBrowse()
{
// 打开文件夹选择对话框
BROWSEINFO bi;
ZeroMemory(&bi, sizeof(bi));
bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;
LPITEMIDLIST pidl = SHBrowseForFolder(&bi);
if (pidl != NULL)
{
TCHAR szFolderPath[MAX_PATH];
SHGetPathFromIDList(pidl, szFolderPath);
m_strFolderPath = szFolderPath;
UpdateData(FALSE);
}
}
void CMyDlg::OnBnClickedButtonSearch()
{
UpdateData(TRUE);
DoSearch();
SaveHistory();
}
void CMyDlg::DoSearch()
{
m_lstResult.DeleteAllItems();
// 枚举文件夹中的文件和子文件夹
CString strSearchPath = m_strFolderPath + _T("\\*.*");
WIN32_FIND_DATA FindFileData;
HANDLE hFind = FindFirstFile(strSearchPath, &FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
return;
do
{
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
// 如果是子文件夹,则递归查找
if (m_bSearchSubDir && _tcscmp(FindFileData.cFileName, _T(".")) != 0 && _tcscmp(FindFileData.cFileName, _T("..")) != 0)
{
CString strSubDirPath = m_strFolderPath + _T("\\") + FindFileData.cFileName;
m_strFolderPath = strSubDirPath;
DoSearch();
}
}
else
{
// 如果是文件,则进行匹配
CString strFilePath = m_strFolderPath + _T("\\") + FindFileData.cFileName;
CString strFileName = FindFileData.cFileName;
CString strFolderName = m_strFolderPath.Mid(m_strFolderPath.ReverseFind('\\') + 1);
if (m_bIncludeFolder)
strFileName = strFolderName + _T("\\") + strFileName;
if (m_bPartialMatch)
{
if (strFileName.Find(m_strFileName) != -1)
{
int nIndex = m_lstResult.InsertItem(m_lstResult.GetItemCount(), strFileName);
m_lstResult.SetItemText(nIndex, 1, strFilePath);
}
}
else
{
if (strFileName.CompareNoCase(m_strFileName) == 0)
{
int nIndex = m_lstResult.InsertItem(m_lstResult.GetItemCount(), strFileName);
m_lstResult.SetItemText(nIndex, 1, strFilePath);
}
}
}
} while (FindNextFile(hFind, &FindFileData));
FindClose(hFind);
}
void CMyDlg::LoadHistory()
{
// 从注册表中读取历史记录
CWinApp* pApp = AfxGetApp();
m_strFolderPath = pApp->GetProfileString(_T("Settings"), _T("FolderPath"), _T(""));
m_strFileName = pApp->GetProfileString(_T("Settings"), _T("FileName"), _T(""));
m_bPartialMatch = pApp->GetProfileInt(_T("Settings"), _T("PartialMatch"), TRUE);
m_bSearchSubDir = pApp->GetProfileInt(_T("Settings"), _T("SearchSubDir"), TRUE);
m_bIncludeFolder = pApp->GetProfileInt(_T("Settings"), _T("IncludeFolder"), FALSE);
// 更新控件值
UpdateData(FALSE);
}
void CMyDlg::SaveHistory()
{
// 保存历史记录到注册表中
CWinApp* pApp = AfxGetApp();
pApp->WriteProfileString(_T("Settings"), _T("FolderPath"), m_strFolderPath);
pApp->WriteProfileString(_T("Settings"), _T("FileName"), m_strFileName);
pApp->WriteProfileInt(_T("Settings"), _T("PartialMatch"), m_bPartialMatch);
pApp->WriteProfileInt(_T("Settings"), _T("SearchSubDir"), m_bSearchSubDir);
pApp->WriteProfileInt(_T("Settings"), _T("IncludeFolder"), m_bIncludeFolder);
}
```
在对话框类的消息映射中添加以下代码:
```
BEGIN_MESSAGE_MAP(CMyDlg, CDialogEx)
ON_BN_CLICKED(IDC_BUTTON_BROWSE, &CMyDlg::OnBnClickedButtonBrowse)
ON_BN_CLICKED(IDC_BUTTON_SEARCH, &CMyDlg::OnBnClickedButtonSearch)
END_MESSAGE_MAP()
```
至此,一个简单的文件查找对话框就实现了。
阅读全文