bool CCommonAppUtils::FileOpenSave(CString& path, int * filterindex, UINT title, UINT filterId, bool bOpen, const CString& initialDir, HWND hwndOwner) { HRESULT hr; // Create a new common save file dialog CComPtr<IFileDialog> pfd = NULL; hr = pfd.CoCreateInstance(bOpen ? CLSID_FileOpenDialog : CLSID_FileSaveDialog, NULL, CLSCTX_INPROC_SERVER); if (SUCCEEDED(hr)) { // Set the dialog options DWORD dwOptions; if (SUCCEEDED(hr = pfd->GetOptions(&dwOptions))) { if (bOpen) hr = pfd->SetOptions(dwOptions | FOS_FILEMUSTEXIST | FOS_FORCEFILESYSTEM | FOS_PATHMUSTEXIST); else { hr = pfd->SetOptions(dwOptions | FOS_OVERWRITEPROMPT | FOS_FORCEFILESYSTEM | FOS_PATHMUSTEXIST); hr = pfd->SetFileName(CPathUtils::GetFileNameFromPath(path)); } } // Set a title if (SUCCEEDED(hr) && title) { CString temp; temp.LoadString(title); CStringUtils::RemoveAccelerators(temp); pfd->SetTitle(temp); } if (filterId) { CSelectFileFilter fileFilter(filterId); hr = pfd->SetFileTypes(fileFilter.GetCount(), fileFilter); } // set the default folder CComPtr<IShellItem> psiFolder; if (!initialDir.IsEmpty()) { hr = SHCreateItemFromParsingName(initialDir, NULL, IID_PPV_ARGS(&psiFolder)); if (SUCCEEDED(hr)) pfd->SetFolder(psiFolder); hr = S_OK; } // Show the save/open file dialog if (SUCCEEDED(hr) && SUCCEEDED(hr = pfd->Show(hwndOwner))) { // Get the selection from the user CComPtr<IShellItem> psiResult = NULL; hr = pfd->GetResult(&psiResult); if (SUCCEEDED(hr)) { PWSTR pszPath = NULL; hr = psiResult->GetDisplayName(SIGDN_FILESYSPATH, &pszPath); if (SUCCEEDED(hr)) { path = CString(pszPath); if (filterindex) { UINT fi = 0; pfd->GetFileTypeIndex(&fi); *filterindex = fi; } return true; } } } } else { OPENFILENAME ofn = {0}; // common dialog box structure TCHAR szFile[MAX_PATH] = {0}; // buffer for file name. Explorer can't handle paths longer than MAX_PATH. ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hwndOwner; wcscpy_s(szFile, (LPCTSTR)path); ofn.lpstrFile = szFile; ofn.nMaxFile = _countof(szFile); CSelectFileFilter fileFilter; if (filterId) { fileFilter.Load(filterId); ofn.lpstrFilter = fileFilter; } ofn.nFilterIndex = 1; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; if (!initialDir.IsEmpty()) ofn.lpstrInitialDir = initialDir; CString temp; if (title) { temp.LoadString(title); CStringUtils::RemoveAccelerators(temp); } ofn.lpstrTitle = temp; if (bOpen) ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_EXPLORER; else ofn.Flags = OFN_OVERWRITEPROMPT | OFN_EXPLORER; // Display the Open dialog box. PreserveChdir preserveDir; bool bRet = false; if (bOpen) { bRet = !!GetOpenFileName(&ofn); } else { bRet = !!GetSaveFileName(&ofn); } if (bRet) { path = CString(ofn.lpstrFile); if (filterindex) *filterindex = ofn.nFilterIndex; return true; } } return false; }
bool CCommonAppUtils::FileOpenSave(CString& path, int * filterindex, UINT title, UINT filter, bool bOpen, HWND hwndOwner, LPCTSTR defaultExt) { OPENFILENAME ofn = {0}; // common dialog box structure TCHAR szFile[MAX_PATH] = {0}; // buffer for file name. Explorer can't handle paths longer than MAX_PATH. ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hwndOwner; if (path.GetLength() >= MAX_PATH) { CString dir = path; while (true) { int index = dir.ReverseFind(_T('\\')); if (index < 0) break; dir = dir.Left(index); if (PathFileExists(dir)) break; } GetShortPathName(dir, szFile, MAX_PATH); CString remain = path.Right(path.GetLength() - dir.GetLength()); _tcscat_s(szFile, MAX_PATH, remain); } else _tcscpy_s(szFile, MAX_PATH, (LPCTSTR)path); ofn.lpstrFile = szFile; ofn.nMaxFile = _countof(szFile); CSelectFileFilter fileFilter; if (filter) { fileFilter.Load(filter); ofn.lpstrFilter = fileFilter; } ofn.nFilterIndex = 1; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.lpstrDefExt = defaultExt; CString temp; if (title) { temp.LoadString(title); CStringUtils::RemoveAccelerators(temp); } ofn.lpstrTitle = temp; if (bOpen) ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_EXPLORER; else ofn.Flags = OFN_OVERWRITEPROMPT | OFN_EXPLORER; // Display the Open dialog box. bool bRet = false; if (bOpen) { bRet = !!GetOpenFileName(&ofn); } else { bRet = !!GetSaveFileName(&ofn); } SetCurrentDirectory(sOrigCWD.GetBuffer()); sOrigCWD.ReleaseBuffer(); if (bRet) { path = CString(ofn.lpstrFile); if (filterindex) *filterindex = ofn.nFilterIndex; return true; } return false; }