格式说明:
explicit CFileDialog(
BOOL bOpenFileDialog, //TRUE 为打开, FALSE 为保存
LPCTSTR lpszDefExt = NULL, // 默认文件扩展名
LPCTSTR lpszFileName = NULL, //文件对话框中 初始的文件名
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, //设定对话框功能
LPCTSTR lpszFilter = NULL, //文件过滤
CWnd* pParentWnd = NULL,
DWORD dwSize = 0, // The size of theOPENFILENAME structure, 默认为0 ,表示自动确定正确的大小
BOOL bVistaStyle = TRUE
);
参数含义详细说明:
Either a File Open or File Save As dialog box is constructed, depending on the value ofbOpenFileDialog.
To enable the user to select multiple files, set the OFN_ALLOWMULTISELECT flag before you callDoModal.
You must supply your own file name buffer to store the returned list of multiple file names. Do this by replacing
m_ofn.lpstrFile with a pointer to a buffer you have allocated, after you construct theCFileDialog, but before you call
DoModal. Additionally, you must set m_ofn.nMaxFile with the number of characters in the buffer pointed to by
m_ofn.lpstrFile. If you set the maximum number of files to be selected ton, the necessary buffer size isn*
(_MAX_PATH + 1) + 1.
实例1 打开文件:
// Create dialog to open multiple files. CFileDialog dlg(TRUE, _T("txt"), _T("*.txt"), OFN_ALLOWMULTISELECT); // Create buffer for file names. const DWORD numberOfFileNames = 100; const DWORD fileNameMaxLength = MAX_PATH + 1; const DWORD bufferSize = (numberOfFileNames * fileNameMaxLength) + 1; TCHAR* filenamesBuffer = new TCHAR[bufferSize]; // Initialize beginning and end of buffer. filenamesBuffer[0] = NULL; filenamesBuffer[bufferSize-1] = NULL; // Attach buffer to OPENFILENAME member. dlg.m_ofn.lpstrFile = filenamesBuffer; dlg.m_ofn.nMaxFile = bufferSize; // Create array for file names. CString fileNameArray[numberOfFileNames]; if(dlg.DoModal() == IDOK) { // Retrieve file name(s). POSITION fileNamesPosition = dlg.GetStartPosition(); int iCtr = 0; while(fileNamesPosition != NULL) { fileNameArray[iCtr] = dlg.GetNextPathName(fileNamesPosition); iCtr++; } } // Release file names buffer. delete[] filenamesBuffer;
实例2 打开文件:
CFileDialog dlg( TRUE, "*", "*.xyz", OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_ALLOWMULTISELECT, "All Files(*.xyz|*.xyz||" ); char szbuffer[1024]; szbuffer[0]=0; dlg.m_ofn.lpstrFile = szbuffer; dlg.m_ofn.nMaxFile = 1024; if(IDOK==dlg.DoModal()) { POSITION pos = dlg.GetStartPosition(); CString filepath; while(pos!=NULL) { filepath = dlg.GetNextPathName(pos); } }
实例3 打开文件:
CString filePath; char fileName[256]; char filter[] = "GEO Files(*.GEO)|*.GEO|All Files(*.*)|*.*||"; UpdateData(TRUE); CFileDialog fdlg(TRUE, "bmp", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter ); strcpy(FileName, _T("文件")); if ( IDOK != cf.DoModal()) return; filePath = fdlg.GetPathName(); // filePath即为所打开的文件的路径 UpdateData(FALSE);
实例4 打开文件,并设置对话框标题
CFileDialog nFileDlg(TRUE,L"xml",L"",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,L"XML文件(*.xml)|*.xml||"); nFileDlg.m_pOFN->lpstrTitle=L"打开空白任务"; //文件对话框标题 if(nFileDlg.DoModal()==IDOK) { m_PicFolder=L"Blank"; m_XMLFolder=L"Blank"; CString szXmlFilePath; CString szXmlParentPath; CString nXMLFileName; szXmlFilePath=nFileDlg.GetPathName(); // 绝对路径文件名 nXMLFileName=nFileDlg.GetFileName(); // 不带路径的文件名 szXmlParentPath=szXmlFilePath.Left(szXmlFilePath.GetLength()-nXMLFileName.GetLength()-1); //文件所在的父目录 }
实例5 保存文件:
char FileName[256]; CString Title, FmtString; CString PathName; CString path_and_fileName; UpdateData(TRUE); PathName=_T("path.xml"); char BASED_CODE szFilter[] = "XML Files(*.xml)|*.XML|All Files(*.*)|*.*||"; CFileDialog fdlg(FALSE, "XML", PathName, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter ); strcpy(FileName, _T("文件名")); if ( IDOK != fdlg.DoModal() ) return; path_and_fileName= fdlg.GetPathName(); //path_and_fileName即为文件保存路径 UpdateData(FALSE);
以上是使用 CFileDialog打开文件,下面是使用SHBrowseForFolder打开路径:
OnBnClickedButton1() { BROWSEINFO bi; ZeroMemory(&bi,sizeof(BROWSEINFO)); LPMALLOC pMalloc; LPITEMIDLIST pidl = SHBrowseForFolder(&bi); if (pidl==NULL) return; if(pidl != NULL) { TCHAR * path = new TCHAR[MAX_PATH]; SHGetPathFromIDList(pidl,path); // MessageBox(NULL,path,TEXT("Choose"),MB_OK); if(SUCCEEDED(SHGetMalloc(&pMalloc)))//pidl指向的对象用完应该释放,之前忽略了 { pMalloc->Free(pidl); pMalloc->Release(); } m_Path=path; UpdateData(FALSE); delete [] path; } }
如果此文对您有所帮助,还望点击一下以下网站:
360导航
2345导航