Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}