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