1、打开文件对话框属于Windows通用对话框!
2、使用API函数GetOpenFileName可以显示打开文件对话框并返回所选文件。
3、MFC对GetOpenFileName的封装类为CFileDialog。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
1、建立基于对话框的MFC应用程序OpenFileDemo
2、在主对话框上添加一个文本框,其ID为IDC_EDT_RESULT,并选中"Horizontal scroll"、"Vertical scroll"、"Multiline"
3、在主对话框上添加一个Check Box控件,文本修改为“多选” , ID改为IDC_CHK_MULTISEL,并关联控件型变量m_chkMultiSel。
4、将主对话框上“确定”按钮改为“SDK”,ID改为ID_BTN_SDK
5、将“取消”按钮改为“MFC”,ID改为IDC_BTN_MFC
///SDK方式调用打开文件对话框处理函数、
void COpenFileDemoDlg::OnBtnSdk()
{
// TODO: Add your control notification handler code here
// TODO: Add extra validation here
///存放文件的缓冲
TCHAR szBuffer[MAX_PATH*10] = {0};
///初始化结构
OPENFILENAME ofn = {0};
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = m_hWnd;
///MFC使用"|"作为分隔符,而SDK使用"\0"作为分隔符
ofn.lpstrFilter = _T("文本文件(*.txt)\0*.txt\0所有文件(*.*)\0*.*\0");
ofn.lpstrInitialDir = _T("c:\\");
ofn.lpstrFile = szBuffer;
ofn.nMaxFile = sizeof(szBuffer) / sizeof( *szBuffer);
ofn.nFilterIndex = 0 ;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER;
///如果多选,加上多选标记
if(m_chkMultiSel.GetCheck())
ofn.Flags |= OFN_ALLOWMULTISELECT;
*************************
///显示打开文件对话框
//******************************
BOOL bSel = GetOpenFileName(&ofn);
if(!bSel)
{
SetDlgItemText(IDC_EDT_RESULT ,_T("选择被取消\n"));
return ;
}
///获得所选文件
if(m_chkMultiSel.GetCheck())
{
如果有多选标志,缓冲区第一节为路径,文件名在路径后
TCHAR szPath[MAX_PATH] = {0};
CString str;
int nLen ;
TCHAR *p = ofn.lpstrFile + ofn.nFileOffset ;
_tcsncpy(szPath , ofn.lpstrFile , ofn.nFileOffset );
if(szPath[ofn.nFileOffset - 1 ] != '\\')
{
_tcscat(szPath , _T("\\" ));
}
while(true)
{
nLen = _tcslen(p);
if(nLen == 0)
break;
str += szPath;
str += p ;
str += _T("\r\n");
p += nLen + 1;
}
SetDlgItemTex(IDC_EDT_RESULT, str);
}
else
{
///如果没有多选标志,缓冲区内为完整文件名
SetDlgItemText(IDC_EDT_RESULT,szBuffer);
}
}
///MFC方式调用打开文件对话框响应函数
void COpenFileDemoDlg::OnBtnMfc()
{
// TODO: Add your control notification handler code here
///定义缓冲和对话框
TCHAR szBuffer[MAX_PATH*10] = {0};
CFileDialog dlg(TRUE , NULL ,NULL , OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST ,
_T("文本文件(*.txt) | *.txt | 所有文件(*.*)|*.*||") ,this);
dlg.m_ofn.lpstrInitialDir = _T("c:\\");
///如果多选,需要给对话框分配更大的缓冲区以保证更多的文件名
if(m_chkMultiSel.GetCheck())
{
///给对话框的m_ofn成员重新分配一个更大的缓冲区来接受文件名。否则在文件名加起来超过260个字符时,函数就会调用失败
dlg.m_ofn.lpstrFile = szBuffer;
dlg.m_ofn.nMaxFile = sizeof(szBuffer) / sizeof(*szBuffer);
dlg.m_ofn.Flags |= OFN_ALLOWMULTISELECT;
}
///显示对话框
if(dlg.DoModal() != IDOK)
{
SetDlgItemText(IDC_EDT_RESULT ,_T("选择被取消."));
return ;
}
///得到所选文件
if(m_chkMultiSel.GetCheck())
{
///如果有多选标志,需要用循环获取文件名
CString strFile;
POSITION pos = dlg.GetStartPosition();
while(pos)
{
strFile += dlg.GetNextPathName(pos);
strFile += _T("\r\n");
}
SetDlgItemText(IDC_EDT_RESULT ,strFile);
}
else
{
///如果没有所选标志,可以直接获得文件名
SetDlgItemText(IDC_EDT_RESULT ,dlg.GetPathName());
}
}