打开文件对话框使用实例

来源:互联网 发布:柯炳生 知乎 编辑:程序博客网 时间:2024/04/29 16:41

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());}}