windows - Forprogrammeret forhåndsvalg ved hjælp af IFileDialog i C ++

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg er forvirret over, om IFileDialog har mulighed for programmatisk at vælge et emne inde i dialogboksen, selv uden at brugeren vælger.


Eks.
IFileDialog viser med ingenting valgt som standard [5]


Jeg håbede at opnå åbningen IFileDialog og derefter vælge en standard emne/mappe inde i dialogboksen.
Eks.
Standard vælger et emne/en mappe inde i dialogboksen [6]


Af den måde, i billedet ovenfor. Jeg har manuelt klikket på/vælg mappen.
Men jeg håbede på at implementere et standard valgt element i IFileDialog.

Bedste reference


Fremgangsmåden foreslået af zett42 fungerer. Du skal implementere din egen version af IFileDialogEvents. Efter tilslutning med IFileDialog::Advise kan du spørge din vej til IShellView og det gør det muligt at ændre valget.


Dette eksempel er lidt dumt, fordi jeg også tvinger biblioteket til at være sikker på, at jeg har en fil, jeg kan vælge.


struct MyIFileDialogEvents : public IFileDialogEvents {
    bool forcedDir, forcedSel;
    MyIFileDialogEvents() : forcedDir(false), forcedSel(false) {}
    ...
};

STDMETHODIMP MyIFileDialogEvents::OnFolderChanging( IFileDialog *pfd, IShellItem*psiFolder)
{
    if (forcedDir) return S\_OK; else forcedDir = true;
    IShellItem*psiwindir;
    HRESULT hr = SHGetKnownFolderItem(FOLDERID\_Windows, KF\_FLAG\_DEFAULT, NULL, IID\_IShellItem, (void**) &psiwindir);
    if (!hr)
    {
        hr = pfd->SetFolder(psiwindir); // MSDN says it is OK to change the folder in OnFolderChanging with SetFolder
        psiwindir->Release();
    }
    if (FAILED(hr)) forcedSel = true;
    return S\_OK;
}

STDMETHODIMP MyIFileDialogEvents::OnFolderChange(IFileDialog *pfd)
{
    if (forcedSel || !forcedDir) return S\_OK; else forcedSel = true;
    IShellItem*psiwindir, *psiexp;
    HRESULT hr = SHGetKnownFolderItem(FOLDERID\_Windows, KF\_FLAG\_DEFAULT, NULL, IID\_IShellItem, (void**) &psiwindir);
    if (!hr)
    {
        hr = SHCreateItemFromRelativeName(psiwindir, L"Explorer.exe", NULL, IID\_IShellItem, (void**) &psiexp);
        psiwindir->Release();
        if (!hr)
        {
            IServiceProvider*pSP;
            IShellBrowser*pSB;
            IShellView*pSV;
            if (!pfd->QueryInterface(IID\_IServiceProvider, (void**) &pSP))
            {
                if (!pSP->QueryService(SID\_STopLevelBrowser, IID\_IShellBrowser, (void**)&pSB))
                {
                    if (!pSB->QueryActiveShellView(&pSV))
                    {
                        PIDLIST\_ABSOLUTE pidl;
                        if (!SHGetIDListFromObject(psiexp, &pidl))
                        {
                            pSV->SelectItem(ILFindLastID(pidl), SVSI\_SELECT|SVSI\_ENSUREVISIBLE|SVSI\_FOCUSED|SVSI\_DESELECTOTHERS);
                            CoTaskMemFree(pidl);
                        }
                        pSV->Release();
                    }
                    pSB->Release();
                }
                pSP->Release();
            }
            psiexp->Release();
        }
    }
    return S\_OK;
}