BOOL OpenFilesVistaUp(HWND hwnd, lFILEINFO *pFInfoList) { IFileOpenDialog *pfd; IFileDialogCustomize *pfdc; FILEOPENDIALOGOPTIONS dwOptions; DWORD dwCookie = 0; CoInitialize(NULL); // CoCreate the dialog object. HRESULT hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pfd)); if (SUCCEEDED(hr)) { hr = pfd->QueryInterface(IID_PPV_ARGS(&pfdc)); if(SUCCEEDED(hr)) { hr = pfdc->EnableOpenDropDown(FDIALOG_OPENCHOICES); if (SUCCEEDED(hr)) { hr = pfdc->AddControlItem(FDIALOG_OPENCHOICES, FDIALOG_CHOICE_OPEN, L"&Open"); if (SUCCEEDED(hr)) { hr = pfdc->AddControlItem(FDIALOG_OPENCHOICES, FDIALOG_CHOICE_REPARENT, L"&Reparent hash file"); hr = pfdc->AddControlItem(FDIALOG_OPENCHOICES, FDIALOG_CHOICE_ALLHASHES, L"&Open all hash files"); hr = pfdc->AddControlItem(FDIALOG_OPENCHOICES, FDIALOG_CHOICE_BSD, L"&Force open as BSD-style"); } } } pfdc->Release(); hr = pfd->GetOptions(&dwOptions); if (SUCCEEDED(hr)) { hr = pfd->SetOptions(dwOptions | FOS_ALLOWMULTISELECT | FOS_FORCEFILESYSTEM); if (SUCCEEDED(hr)) { COpenFileListener *ofl = new COpenFileListener(pFInfoList); hr = pfd->Advise(ofl,&dwCookie); if (SUCCEEDED(hr)) { hr = pfd->Show(hwnd); if (SUCCEEDED(hr)) { } pfd->Unadvise(dwCookie); } } } pfd->Release(); } CoUninitialize(); return SUCCEEDED(hr); }
BOOL CSaveImageDialog::OnFileNameOK() { if (IsWinVistaOrLater()) { IFileDialogCustomize* pfdc = GetIFileDialogCustomize(); if (pfdc) { WCHAR* result; pfdc->GetEditBoxText(IDC_EDIT4, &result); int quality = _wtoi(result); if (quality > 0 && quality <= 100) { m_quality = quality; } CoTaskMemFree(result); pfdc->GetEditBoxText(IDC_EDIT5, &result); int level = _wtoi(result); if (level > 0 && level <= 9) { m_levelPNG = level; } CoTaskMemFree(result); pfdc->Release(); } } else { m_quality = m_qualityctrl.GetPos(); } return __super::OnFileNameOK(); }
CSaveTextFileDialog::CSaveTextFileDialog( CTextFile::enc e, LPCTSTR lpszDefExt, LPCTSTR lpszFileName, LPCTSTR lpszFilter, CWnd* pParentWnd) : CFileDialog(FALSE, lpszDefExt, lpszFileName, OFN_EXPLORER | OFN_ENABLESIZING | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_NOCHANGEDIR, lpszFilter, pParentWnd), m_e(e) { if (SysVersion::IsVistaOrLater()) { // customization has to be done before OnInitDialog IFileDialogCustomize* pfdc = GetIFileDialogCustomize(); pfdc->StartVisualGroup(IDS_TEXTFILE_ENC, ResStr(IDS_TEXTFILE_ENC)); pfdc->AddComboBox(IDC_COMBO1); pfdc->AddControlItem(IDC_COMBO1, CTextFile::ASCII, _T("ANSI")); pfdc->AddControlItem(IDC_COMBO1, CTextFile::LE16, _T("Unicode 16-LE")); pfdc->AddControlItem(IDC_COMBO1, CTextFile::BE16, _T("Unicode 16-BE")); pfdc->AddControlItem(IDC_COMBO1, CTextFile::UTF8, _T("UTF-8")); pfdc->SetSelectedControlItem(IDC_COMBO1, m_e); pfdc->EndVisualGroup(); pfdc->MakeProminent(IDS_TEXTFILE_ENC); pfdc->Release(); } else { SetTemplate(0, IDD_SAVETEXTFILEDIALOGTEMPL); } }
STDMETHODIMP COpenFileListener::OnFileOk(IFileDialog* pfd) { IShellItemArray *psiaResults; IFileDialogCustomize *pfdc; HRESULT hr; IFileOpenDialog *fod; FILEINFO fileinfoTmp = {0}; DWORD choice; fileinfoTmp.parentList = pFInfoList; hr = pfd->QueryInterface(IID_PPV_ARGS(&fod)); if(SUCCEEDED(hr)) { hr = fod->GetSelectedItems(&psiaResults); if (SUCCEEDED(hr)) { DWORD fileCount; IShellItem *isi; LPWSTR pwsz = NULL; psiaResults->GetCount(&fileCount); for(DWORD i=0;i<fileCount;i++) { psiaResults->GetItemAt(i,&isi); isi->GetDisplayName(SIGDN_FILESYSPATH,&pwsz); isi->Release(); fileinfoTmp.szFilename = pwsz; pFInfoList->fInfos.push_back(fileinfoTmp); CoTaskMemFree(pwsz); } psiaResults->Release(); } fod->Release(); } hr = pfd->QueryInterface(IID_PPV_ARGS(&pfdc)); if(SUCCEEDED(hr)) { hr = pfdc->GetSelectedControlItem(FDIALOG_OPENCHOICES,&choice); if(SUCCEEDED(hr)) { if(choice==FDIALOG_CHOICE_REPARENT) { pFInfoList->uiCmdOpts = CMD_REPARENT; } else if(choice==FDIALOG_CHOICE_ALLHASHES) { pFInfoList->uiCmdOpts = CMD_ALLHASHES; } else if(choice==FDIALOG_CHOICE_BSD) { pFInfoList->uiCmdOpts = CMD_FORCE_BSD; } } pfdc->Release(); } return S_OK; }
BOOL CSaveTextFileDialog::OnFileNameOK() { if (SysVersion::IsVistaOrLater()) { DWORD result; IFileDialogCustomize* pfdc = GetIFileDialogCustomize(); pfdc->GetSelectedControlItem(IDC_COMBO1, &result); pfdc->Release(); m_e = (CTextFile::enc)result; } else { m_e = (CTextFile::enc)m_encoding.GetItemData(m_encoding.GetCurSel()); } return __super::OnFileNameOK(); }
CSaveImageDialog::CSaveImageDialog( int quality, int levelPNG, LPCTSTR lpszDefExt, LPCTSTR lpszFileName, LPCTSTR lpszFilter, CWnd* pParentWnd) : CFileDialog(FALSE, lpszDefExt, lpszFileName, OFN_EXPLORER|OFN_ENABLESIZING|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_PATHMUSTEXIST|OFN_NOCHANGEDIR, lpszFilter, pParentWnd) , m_quality(quality) , m_levelPNG(levelPNG) { if (IsWinVistaOrLater()) { IFileDialogCustomize* pfdc = GetIFileDialogCustomize(); if (pfdc) { // Create an event handling object, and hook it up to the dialog. IFileDialogEvents *pfde = NULL; HRESULT hr = _CDialogEventHandler_CreateInstance(IID_PPV_ARGS(&pfde)); if (SUCCEEDED(hr)) { // Hook up the event handler. DWORD dwCookie; hr = GetIFileSaveDialog()->Advise(pfde, &dwCookie); if (SUCCEEDED(hr)) { ; } } CString str; pfdc->StartVisualGroup(IDS_THUMB_IMAGE_QUALITY, ResStr(IDS_THUMB_IMAGE_QUALITY)); pfdc->AddText(IDS_THUMB_QUALITY, ResStr(IDS_THUMB_QUALITY)); str.Format(L"%d", max(70, min(100, m_quality))); pfdc->AddEditBox(IDC_EDIT4, str); pfdc->AddText(IDS_THUMB_LEVEL, ResStr(IDS_THUMB_LEVEL)); str.Format(L"%d", max(1, min(9, m_levelPNG))); pfdc->AddEditBox(IDC_EDIT5, str); pfdc->EndVisualGroup(); pfdc->Release(); } } else { SetTemplate(0, IDD_SAVEIMAGEDIALOGTEMPL); } }
CBrowseFolder::retVal CBrowseFolder::Show(HWND parent, CString& path, const CString& sDefaultPath /* = CString() */) { retVal ret = OK; //assume OK m_sDefaultPath = sDefaultPath; if (m_sDefaultPath.IsEmpty() && !path.IsEmpty()) { // if the result path already contains a path, use that as the default path m_sDefaultPath = path; } HRESULT hr; // Create a new common open file dialog IFileOpenDialog* pfd = NULL; hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pfd)); if (SUCCEEDED(hr)) { // Set the dialog as a folder picker DWORD dwOptions; if (SUCCEEDED(hr = pfd->GetOptions(&dwOptions))) { hr = pfd->SetOptions(dwOptions | FOS_PICKFOLDERS | FOS_FORCEFILESYSTEM | FOS_PATHMUSTEXIST); } // Set a title if (SUCCEEDED(hr)) { TCHAR * nl = _tcschr(m_title, '\n'); if (nl) *nl = 0; pfd->SetTitle(m_title); } // set the default folder if (SUCCEEDED(hr)) { typedef HRESULT (WINAPI *SHCIFPN)(PCWSTR pszPath, IBindCtx * pbc, REFIID riid, void ** ppv); CAutoLibrary hLib = AtlLoadSystemLibraryUsingFullPath(L"shell32.dll"); if (hLib) { SHCIFPN pSHCIFPN = (SHCIFPN)GetProcAddress(hLib, "SHCreateItemFromParsingName"); if (pSHCIFPN) { IShellItem *psiDefault = 0; hr = pSHCIFPN(m_sDefaultPath, NULL, IID_PPV_ARGS(&psiDefault)); if (SUCCEEDED(hr)) { hr = pfd->SetFolder(psiDefault); psiDefault->Release(); } } } } if (m_CheckText[0] != 0) { IFileDialogCustomize* pfdCustomize = 0; hr = pfd->QueryInterface(IID_PPV_ARGS(&pfdCustomize)); if (SUCCEEDED(hr)) { pfdCustomize->StartVisualGroup(100, L""); pfdCustomize->AddCheckButton(101, m_CheckText, FALSE); if (m_CheckText2[0] != 0) { pfdCustomize->AddCheckButton(102, m_CheckText2, FALSE); } pfdCustomize->EndVisualGroup(); pfdCustomize->Release(); } } // Show the open file dialog if (SUCCEEDED(hr) && SUCCEEDED(hr = pfd->Show(parent))) { // Get the selection from the user IShellItem* psiResult = NULL; hr = pfd->GetResult(&psiResult); if (SUCCEEDED(hr)) { PWSTR pszPath = NULL; hr = psiResult->GetDisplayName(SIGDN_FILESYSPATH, &pszPath); if (SUCCEEDED(hr)) { path = pszPath; CoTaskMemFree(pszPath); } psiResult->Release(); IFileDialogCustomize* pfdCustomize = 0; hr = pfd->QueryInterface(IID_PPV_ARGS(&pfdCustomize)); if (SUCCEEDED(hr)) { pfdCustomize->GetCheckButtonState(101, &m_bCheck); pfdCustomize->GetCheckButtonState(102, &m_bCheck2); pfdCustomize->Release(); } } else ret = CANCEL; } else ret = CANCEL; pfd->Release(); } else { BROWSEINFO browseInfo = {}; browseInfo.hwndOwner = parent; browseInfo.pidlRoot = m_root; browseInfo.pszDisplayName = m_displayName; browseInfo.lpszTitle = m_title; browseInfo.ulFlags = m_style; browseInfo.lParam = (LPARAM)this; if ((_tcslen(m_CheckText) > 0)||(!m_sDefaultPath.IsEmpty())) { browseInfo.lpfn = BrowseCallBackProc; } PCIDLIST_ABSOLUTE itemIDList = SHBrowseForFolder(&browseInfo); //is the dialog canceled? if (!itemIDList) ret = CANCEL; if (ret != CANCEL) { if (!SHGetPathFromIDList(itemIDList, path.GetBuffer(MAX_PATH))) // MAX_PATH ok. Explorer can't handle paths longer than MAX_PATH. ret = NOPATH; path.ReleaseBuffer(); CoTaskMemFree((LPVOID)itemIDList); } } return ret; }
IFACEMETHODIMP CDialogEventHandler::OnTypeChange(IFileDialog *pfd) { IFileSaveDialog *pfsd; HRESULT hr = pfd->QueryInterface(&pfsd); if (SUCCEEDED(hr)) { UINT uIndex; hr = pfsd->GetFileTypeIndex(&uIndex); // index of current file-type if (SUCCEEDED(hr)) { IFileDialogCustomize* pfdc; hr = pfd->QueryInterface(&pfdc); if (SUCCEEDED(hr)) { switch (uIndex) { case 1: case 5: case 6: pfdc->SetControlState(IDS_THUMB_IMAGE_QUALITY, CDCS_INACTIVE); pfdc->SetControlState(IDS_THUMB_QUALITY, CDCS_INACTIVE); pfdc->SetControlState(IDC_EDIT4, CDCS_INACTIVE); pfdc->SetControlState(IDS_THUMB_LEVEL, CDCS_INACTIVE); pfdc->SetControlState(IDC_EDIT5, CDCS_INACTIVE); break; case 2: case 4: pfdc->SetControlState(IDS_THUMB_IMAGE_QUALITY, CDCS_ENABLEDVISIBLE); pfdc->SetControlState(IDS_THUMB_QUALITY, CDCS_ENABLEDVISIBLE); pfdc->SetControlState(IDC_EDIT4, CDCS_ENABLEDVISIBLE); pfdc->SetControlState(IDS_THUMB_LEVEL, CDCS_INACTIVE); pfdc->SetControlState(IDC_EDIT5, CDCS_INACTIVE); break; case 3: pfdc->SetControlState(IDS_THUMB_IMAGE_QUALITY, CDCS_ENABLEDVISIBLE); pfdc->SetControlState(IDS_THUMB_QUALITY, CDCS_INACTIVE); pfdc->SetControlState(IDC_EDIT4, CDCS_INACTIVE); pfdc->SetControlState(IDS_THUMB_LEVEL, CDCS_ENABLEDVISIBLE); pfdc->SetControlState(IDC_EDIT5, CDCS_ENABLEDVISIBLE); break; default : break; } pfdc->Release(); } } pfsd->Release(); } return hr; }
CBrowseFolder::retVal CBrowseFolder::Show(HWND parent, CString& path, const CString& sDefaultPath /* = CString() */) { retVal ret = OK; //assume OK m_sDefaultPath = sDefaultPath; if (m_sDefaultPath.IsEmpty() && !path.IsEmpty()) { while (!PathFileExists(path) && !path.IsEmpty()) { CString p = path.Left(path.ReverseFind('\\')); if ((p.GetLength() == 2)&&(p[1] == ':')) { p += L"\\"; if (p.Compare(path) == 0) p.Empty(); } if (p.GetLength() < 2) p.Empty(); path = p; } // if the result path already contains a path, use that as the default path m_sDefaultPath = path; } HRESULT hr; // Create a new common open file dialog IFileOpenDialog* pfd = NULL; hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pfd)); if (SUCCEEDED(hr)) { // Set the dialog as a folder picker DWORD dwOptions; if (SUCCEEDED(hr = pfd->GetOptions(&dwOptions))) { hr = pfd->SetOptions(dwOptions | FOS_PICKFOLDERS | FOS_FORCEFILESYSTEM | FOS_PATHMUSTEXIST); } // Set a title if (SUCCEEDED(hr)) { TCHAR * nl = wcschr(m_title, '\n'); if (nl) *nl = 0; pfd->SetTitle(m_title); } // set the default folder if (SUCCEEDED(hr)) { IShellItem *psiDefault = 0; hr = SHCreateItemFromParsingName(m_sDefaultPath, NULL, IID_PPV_ARGS(&psiDefault)); if (SUCCEEDED(hr)) { hr = pfd->SetFolder(psiDefault); psiDefault->Release(); } } if (m_CheckText[0] != 0) { IFileDialogCustomize* pfdCustomize = 0; hr = pfd->QueryInterface(IID_PPV_ARGS(&pfdCustomize)); if (SUCCEEDED(hr)) { pfdCustomize->StartVisualGroup(100, L""); pfdCustomize->AddCheckButton(101, m_CheckText, FALSE); if (m_CheckText2[0] != 0) { pfdCustomize->AddCheckButton(102, m_CheckText2, FALSE); } pfdCustomize->EndVisualGroup(); pfdCustomize->Release(); } } // Show the open file dialog if (SUCCEEDED(hr) && SUCCEEDED(hr = pfd->Show(parent))) { // Get the selection from the user IShellItem* psiResult = NULL; hr = pfd->GetResult(&psiResult); if (SUCCEEDED(hr)) { PWSTR pszPath = NULL; hr = psiResult->GetDisplayName(SIGDN_FILESYSPATH, &pszPath); if (SUCCEEDED(hr)) { path = pszPath; CoTaskMemFree(pszPath); } psiResult->Release(); IFileDialogCustomize* pfdCustomize = 0; hr = pfd->QueryInterface(IID_PPV_ARGS(&pfdCustomize)); if (SUCCEEDED(hr)) { pfdCustomize->GetCheckButtonState(101, &m_bCheck); pfdCustomize->GetCheckButtonState(102, &m_bCheck2); pfdCustomize->Release(); } } else ret = CANCEL; } else ret = CANCEL; pfd->Release(); } else { BROWSEINFO browseInfo = {}; browseInfo.hwndOwner = parent; browseInfo.pidlRoot = m_root; browseInfo.pszDisplayName = m_displayName; browseInfo.lpszTitle = m_title; browseInfo.ulFlags = m_style; browseInfo.lParam = (LPARAM)this; browseInfo.lpfn = BrowseCallBackProc; PCIDLIST_ABSOLUTE itemIDList = SHBrowseForFolder(&browseInfo); //is the dialog canceled? if (!itemIDList) ret = CANCEL; if (ret != CANCEL) { if (!SHGetPathFromIDList(itemIDList, path.GetBuffer(MAX_PATH))) // MAX_PATH ok. Explorer can't handle paths longer than MAX_PATH. ret = NOPATH; path.ReleaseBuffer(); CoTaskMemFree((LPVOID)itemIDList); } } return ret; }