本文介绍在Microsoft Foundation Classes (MFC)编程环境中如何实现打开文件和文件夹的功能,包括必要的API使用及示例代码。
MFC打开文件与文件夹的方法可以分为两种:一种是通过API实现的打开文件对话框功能;另一种则是利用MFC自身提供的方法来完成同样的任务。
### 方法一:使用API
```cpp
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);
// 设置文件类型过滤器
const TCHAR* filterText = _T(所有文件\0*.?\0jpg 文件\0*.jpg\0bmp 文件\0*.bmp\0);
ofn.lpstrFilter = const_cast(filterText);
ofn.nFilterIndex = 1; // 默认选择第一个选项
if(GetOpenFileName(&ofn))
{
::SetDlgItemText(this->m_hWnd, IDC_EDIT1, szFile);
}
```
### 方法二:使用MFC
```cpp
CFileDialog dlg(TRUE, NULL, NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
NULL);
if(dlg.DoModal() == IDOK)
{
CString szFilename = dlg.GetPathName();
::MessageBox(NULL, szFilename, NULL, MB_OK);
}
```
### 打开文件夹的方法
```cpp
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;
LPITEMIDLIST pItemIDList = ::SHBrowseForFolder(&bi);
if(pItemIDList == NULL)
{
return ;
}
::SHGetPathFromIDList(pItemIDList, strDirName);
CString str = strDirName;
// 确保路径以反斜杠结束
if(str != && str.Right(1) != _T(\\))
str += _T(\\);
::SetDlgItemText(this->m_hWnd,IDC_EDIT1,str);
```
以上代码展示了如何利用MFC和Win32 API来实现文件与目录的选择功能。其中,打开文件夹的操作不同于直接选择单个文件,它允许用户指定一个包含多个子项的路径作为最终结果。