Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Počínaje Windows Vista nahrazuje dialogové okno Společná položka starší dialogové okno Společného souboru při otevření nebo uložení souboru. Dialogové okno Společná položka se používá ve dvou variantách: v dialogovém okně Otevřít a v dialogovém okně Uložit . Tyto dva dialogy sdílejí většinu svých funkcí, ale každý z nich má své vlastní jedinečné metody.
Important
IFileDialog je moderní rozhraní API dialogového okna souborů (Windows Vista a novější). Starší funkce GetOpenFileName a GetSaveFileName jsou starší a neměly by se používat v nových aplikacích. Starší rozhraní API nepodporují obor názvů prostředí Shell, moderní přizpůsobení dialogových oken ani funkce metadat souborů.
Při použití IFileDialog:
- Před voláním CoCreateInstance pro vytvoření dialogového okna musíte zavolat CoInitializeEx. Používá se
COINIT_APARTMENTTHREADEDpro vlákna uživatelského rozhraní. - Použít
CLSID_FileOpenDialogneboCLSID_FileSaveDialogsCLSCTX_INPROC_SERVER. -
Moderní alternativy: Pro aplikace UPW/WinUI použijte Windows. Storage.Pickers. Pro desktopové aplikace .NET poskytují WPF (Windows Presentation Foundation) a WinForms obaly
OpenFileDialog/SaveFileDialog, které interně používajíIFileDialog.
I když se tato novější verze jmenuje Dialogové okno Společná položka, ve většině dokumentace se stále nazývá Dialogové okno Společný soubor. Pokud nejde konkrétně o starší verzi Windows, měli byste předpokládat, že každá zmínka o dialogovém okně Common File Dialog se vztahuje k tomuto dialogovému oknu Common Item Dialog.
Zde jsou popsána následující témata:
- IFileDialog, IFileOpenDialog, a IFileSaveDialog
- Naslouchání událostem z dialogového okna
- Přizpůsobení dialogového okna
- Úplné ukázky
- související témata
IFileDialog, IFileOpenDialog, a IFileSaveDialog
Windows Vista poskytuje implementace dialogových oken Otevřít a uložit: CLSID_FileOpenDialog a CLSID_FileSaveDialog. Tato dialogová okna jsou zde zobrazena.
IFileOpenDialog a IFileSaveDialog dědí z IFileDialogu a sdílí většinu jejich funkcí. Kromě toho dialogové okno Otevřít podporuje IFileOpenDialog a dialogové okno Uložit podporuje IFileSaveDialog.
Implementace dialogového okna Společné položky, která se nachází v Windows Vista poskytuje několik výhod oproti implementaci poskytované v dřívějších verzích:
- Podporuje přímé použití oboru názvů prostředí prostřednictvím IShellItem místo použití cest systému souborů.
- Umožňuje jednoduché přizpůsobení dialogového okna, například nastavení popisku na tlačítku OK , aniž by bylo nutné provést proceduru háku.
- Podporuje rozsáhlejší přizpůsobení dialogového okna přidáním sady ovládacích prvků řízených daty, které fungují bez šablony dialogového okna Win32. Toto schéma přizpůsobení uvolní volající proces z rozložení uživatelského rozhraní. Vzhledem k tomu, že všechny změny návrhu dialogového okna nadále používají tento datový model, implementace dialogového okna není svázaná s konkrétní aktuální verzí dialogového okna.
- Podporuje oznámení volajícího o událostech v dialogovém okně, jako je změna výběru nebo změna typu souboru. Také umožňuje volajícímu procesu připojit určité události v dialogovém okně, například parsování.
- Zavádí nové funkce dialogového okna, jako je přidání míst určených volajícím na panel Místa .
- V dialogovém okně Uložit můžou vývojáři využívat nové funkce metadat Windows Vista Shellu.
Vývojáři se navíc můžou rozhodnout implementovat následující rozhraní:
- IFileDialogEvents pro příjem oznámení událostí v dialogovém okně.
- IFileDialogCustomize pro přidání ovládacích prvků do dialogového okna.
- IFileDialogControlEvents pro oznámení událostí u těchto přidaných ovládacích prvků.
Dialogové okno Otevřít nebo Uložit vrátí IShellItem nebo IShellItemArray objekt volající proces. Volající pak může pomocí jednotlivého objektu IShellItem získat cestu k systému souborů nebo otevřít datový proud položky ke čtení nebo zápisu informací.
Příznaky a možnosti dostupné pro nové metody dialogového okna jsou velmi podobné starší příznaky OFN nalezené ve struktuře OPENFILENAME a použity v GetOpenFileName a GetSaveFileName. Mnoho z nich je úplně stejné, s tím rozdílem, že začínají předponou FOS. Úplný seznam najdete v tématech IFileDialog::GetOptions a IFileDialog::SetOptions . Ve výchozím nastavení se dialogová okna Otevřít a Uložit vytvoří s nejběžnějšími příznaky. Pro dialogové okno Otevřít je to (FOS_PATHMUSTEXIST | FOS_FILEMUSTEXIST | FOS_NOCHANGEDIR) a pro dialogové okno Uložit je to (FOS_OVERWRITEPROMPT | FOS_NOREADONLYRETURN | FOS_PATHMUSTEXIST | FOS_NOCHANGEDIR).
IFileDialog a jeho odvozená rozhraní dědí z rozhraní IModalWindow a rozšiřují je.
Show bere jako jediný parametr popisovač nadřazeného okna. Pokud se Show úspěšně vrátí, je k dispozici platný výsledek. Pokud se vrátí HRESULT_FROM_WIN32(ERROR_CANCELLED), znamená to, že uživatel dialogové okno zrušil. Může také legitimním způsobem vrátit jiný kód chyby, například E_OUTOFMEMORY.
Ukázka použití
Následující části ukazují ukázkový kód pro různé úkoly dialogového okna.
- Základní použití
- Omezení výsledků na systémové položky souborů
- Určení typů souborů pro dialogové okno
- Řízení výchozí složky
- Přidání položek na panel místa
- Trvalost stavu
- Možnosti vícenásobného výběru
Většinu vzorového kódu najdete v ukázce běžných souborů sady Windows SDK.
Základní použití
Následující příklad ukazuje, jak spustit dialogové okno Otevřít . V tomto příkladu je omezeno na Microsoft Word dokumenty.
Note
Několik příkladů v tomto tématu používá CDialogEventHandler_CreateInstance pomocnou funkci k vytvoření instance IFileDialogEvents implementace. Pokud chcete tuto funkci použít ve vlastním kódu, zkopírujte zdrojový kód funkce CDialogEventHandler_CreateInstance z ukázky běžného dialogového okna Soubor, ze kterého jsou převzaty všechny příklady v tomto tématu.
HRESULT BasicFileOpen()
{
// CoCreate the File Open Dialog object.
IFileDialog *pfd = NULL;
HRESULT hr = CoCreateInstance(CLSID_FileOpenDialog,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pfd));
if (SUCCEEDED(hr))
{
// Create an event handling object, and hook it up to the dialog.
IFileDialogEvents *pfde = NULL;
hr = CDialogEventHandler_CreateInstance(IID_PPV_ARGS(&pfde));
if (SUCCEEDED(hr))
{
// Hook up the event handler.
DWORD dwCookie;
hr = pfd->Advise(pfde, &dwCookie);
if (SUCCEEDED(hr))
{
// Set the options on the dialog.
DWORD dwFlags;
// Before setting, always get the options first in order
// not to override existing options.
hr = pfd->GetOptions(&dwFlags);
if (SUCCEEDED(hr))
{
// In this case, get shell items only for file system items.
hr = pfd->SetOptions(dwFlags | FOS_FORCEFILESYSTEM);
if (SUCCEEDED(hr))
{
// Set the file types to display only.
// Notice that this is a 1-based array.
hr = pfd->SetFileTypes(ARRAYSIZE(c_rgSaveTypes), c_rgSaveTypes);
if (SUCCEEDED(hr))
{
// Set the selected file type index to Word Docs for this example.
hr = pfd->SetFileTypeIndex(INDEX_WORDDOC);
if (SUCCEEDED(hr))
{
// Set the default extension to be ".doc" file.
hr = pfd->SetDefaultExtension(L"doc;docx");
if (SUCCEEDED(hr))
{
// Show the dialog
hr = pfd->Show(NULL);
if (SUCCEEDED(hr))
{
// Obtain the result once the user clicks
// the 'Open' button.
// The result is an IShellItem object.
IShellItem *psiResult;
hr = pfd->GetResult(&psiResult);
if (SUCCEEDED(hr))
{
// We are just going to print out the
// name of the file for sample sake.
PWSTR pszFilePath = NULL;
hr = psiResult->GetDisplayName(SIGDN_FILESYSPATH,
&pszFilePath);
if (SUCCEEDED(hr))
{
TaskDialog(NULL,
NULL,
L"CommonFileDialogApp",
pszFilePath,
NULL,
TDCBF_OK_BUTTON,
TD_INFORMATION_ICON,
NULL);
CoTaskMemFree(pszFilePath);
}
psiResult->Release();
}
}
}
}
}
}
}
// Unhook the event handler.
pfd->Unadvise(dwCookie);
}
pfde->Release();
}
pfd->Release();
}
return hr;
}
Omezení výsledků na systémové položky souborů
Následující příklad, převzatý z výše, ukazuje, jak omezit výsledky na položky systému souborů. Všimněte si, že IFileDialog::SetOptions přidá nový příznak k hodnotě získané prostřednictvím IFileDialog::GetOptions. Toto je doporučená metoda.
// Set the options on the dialog.
DWORD dwFlags;
// Before setting, always get the options first in order
// not to override existing options.
hr = pfd->GetOptions(&dwFlags);
if (SUCCEEDED(hr))
{
// In this case, get shell items only for file system items.
hr = pfd->SetOptions(dwFlags | FOS_FORCEFILESYSTEM);
Určení typů souborů pro dialogové okno
Chcete-li nastavit konkrétní typy souborů, které dialogové okno může zpracovat, použijte IFileDialog::SetFileTypes metoda. Tato metoda přijímá pole COMDLG_FILTERSPEC struktur, z nichž každá představuje typ souboru.
Výchozí mechanismus rozšíření v dialogovém okně se nezmění od GetOpenFileName a GetSaveFileName. Přípona názvu souboru, která je připojena k textu, který uživatel zadá do textového pole pro úpravy názvu souboru, se inicializuje při otevření dialogového okna. Měl by odpovídat výchozímu typu souboru (který se vybral při otevření dialogového okna). Pokud je výchozí typ souboru "*.*" (všechny soubory), může být soubor příponou podle vašeho výběru. Pokud uživatel zvolí jiný typ souboru, přípona se automaticky aktualizuje na první příponu názvu souboru asociované s tímto typem souboru. Pokud uživatel zvolí "*.*" (všechny soubory), vrátí se přípona k původní hodnotě.
Následující příklad ukazuje, jak to bylo provedeno výše.
// Set the file types to display only.
// Notice that this is a 1-based array.
hr = pfd->SetFileTypes(ARRAYSIZE(c_rgSaveTypes), c_rgSaveTypes);
if (SUCCEEDED(hr))
{
// Set the selected file type index to Word Docs for this example.
hr = pfd->SetFileTypeIndex(INDEX_WORDDOC);
if (SUCCEEDED(hr))
{
// Set the default extension to be ".doc" file.
hr = pfd->SetDefaultExtension(L"doc;docx");
Správa výchozí složky
Téměř libovolnou složku v oboru názvů prostředí lze použít jako výchozí složku dialogového okna (složka, která se zobrazí, když se uživatel rozhodne soubor otevřít nebo uložit). Chcete-li to provést, zavolejte IFileDialog::SetDefaultFolder před voláním Show.
Výchozí složkou je složka, ve které se dialogové okno spustí při prvním otevření uživatele z vaší aplikace. Potom se dialogové okno otevře v poslední složce, kterou uživatel otevřel, nebo v poslední složce, kterou použil k uložení položky. Další podrobnosti najdete v tématu Trvalost stavu .
Dialogové okno můžete vynutit, aby se při otevření vždy zobrazovala stejná složka bez ohledu na předchozí akci uživatele voláním IFileDialog::SetFolder. Nedoporučujeme to ale dělat. Pokud před zobrazením dialogového okna zavoláte SetFolder , nezobrazí se nejnovější umístění, do kterého uživatel uložil nebo otevřel. Pokud neexistuje velmi konkrétní důvod tohoto chování, nejedná se o dobré nebo očekávané uživatelské prostředí a mělo by se jim vyhnout. Téměř ve všech případech je lepší použít metodu IFileDialog::SetDefaultFolder.
Při prvním uložení dokumentu v dialogovém okně Uložit byste měli postupovat podle stejných pokynů při určování počáteční složky, jak jste to udělali v dialogovém okně Otevřít . Pokud uživatel upravuje dříve existující dokument, otevřete dialogové okno ve složce, ve které je dokument uložený, a naplnit pole pro úpravy názvem daného dokumentu. Zavolejte IFileSaveDialog::SetSaveAsItem s aktuální položkou před voláním Show.
Přidání položek na panel místa
Následující příklad ukazuje přidání položek na panel Místa :
HRESULT AddItemsToCommonPlaces()
{
// CoCreate the File Open Dialog object.
IFileDialog *pfd = NULL;
HRESULT hr = CoCreateInstance(CLSID_FileOpenDialog,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pfd));
if (SUCCEEDED(hr))
{
// Always use known folders instead of hard-coding physical file paths.
// In this case we are using Public Music KnownFolder.
IKnownFolderManager *pkfm = NULL;
hr = CoCreateInstance(CLSID_KnownFolderManager,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pkfm));
if (SUCCEEDED(hr))
{
// Get the known folder.
IKnownFolder *pKnownFolder = NULL;
hr = pkfm->GetFolder(FOLDERID_PublicMusic, &pKnownFolder);
if (SUCCEEDED(hr))
{
// File Dialog APIs need an IShellItem that represents the location.
IShellItem *psi = NULL;
hr = pKnownFolder->GetShellItem(0, IID_PPV_ARGS(&psi));
if (SUCCEEDED(hr))
{
// Add the place to the bottom of default list in Common File Dialog.
hr = pfd->AddPlace(psi, FDAP_BOTTOM);
if (SUCCEEDED(hr))
{
// Show the File Dialog.
hr = pfd->Show(NULL);
if (SUCCEEDED(hr))
{
//
// You can add your own code here to handle the results.
//
}
}
psi->Release();
}
pKnownFolder->Release();
}
pkfm->Release();
}
pfd->Release();
}
return hr;
}
Trvalost stavu
Před Windows Vista byl stav, například naposledy navštívená složka, uložen na základě jednotlivých procesů. Tyto informace se však používaly bez ohledu na konkrétní akci. Například aplikace pro střih videa by v dialogovém okně Vyrenderovat jako zobrazila stejnou složku jako v dialogovém okně Importovat média. V Windows Vista můžete být konkrétnější pomocí identifikátorů GUID. Chcete-li přiřadit identifikátor GUID k dialogovému okně, zavolejte iFileDialog::SetClientGuid.
Možnosti vícenásobného výběru
Funkce vícenásobného výběru je k dispozici v dialogovém okně Otevřít pomocí metody GetResults , jak je znázorněno zde.
HRESULT MultiselectInvoke()
{
IFileOpenDialog *pfd;
// CoCreate the dialog object.
HRESULT hr = CoCreateInstance(CLSID_FileOpenDialog,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pfd));
if (SUCCEEDED(hr))
{
DWORD dwOptions;
// Specify multiselect.
hr = pfd->GetOptions(&dwOptions);
if (SUCCEEDED(hr))
{
hr = pfd->SetOptions(dwOptions | FOS_ALLOWMULTISELECT);
}
if (SUCCEEDED(hr))
{
// Show the Open dialog.
hr = pfd->Show(NULL);
if (SUCCEEDED(hr))
{
// Obtain the result of the user interaction.
IShellItemArray *psiaResults;
hr = pfd->GetResults(&psiaResults);
if (SUCCEEDED(hr))
{
//
// You can add your own code here to handle the results.
//
psiaResults->Release();
}
}
}
pfd->Release();
}
return hr;
}
Naslouchání událostem z dialogového okna
Volající proces může zaregistrovat rozhraní IFileDialogEvents v dialogovém okně pomocí IFileDialog::Advise a IFileDialog::Unadvise metody, jak je znázorněno zde.
Toto je převzato z ukázky základního použití .
// Create an event handling object, and hook it up to the dialog.
IFileDialogEvents *pfde = NULL;
hr = CDialogEventHandler_CreateInstance(IID_PPV_ARGS(&pfde));
if (SUCCEEDED(hr))
{
// Hook up the event handler.
DWORD dwCookie;
hr = pfd->Advise(pfde, &dwCookie);
Velké množství zpracování dialogového okna by se sem umístilo.
// Unhook the event handler.
pfd->Unadvise(dwCookie);
}
pfde->Release();
}
pfd->Release();
}
return hr;
}
Volající proces může pro oznámení použít události, když uživatel změní složku, typ souboru nebo výběr. Tyto události jsou zvláště užitečné, když volající proces přidal ovládací prvky do dialogového okna (viz Přizpůsobení dialogového okna) a musí změnit stav těchto ovládacích prvků v reakci na tyto události. Užitečné ve všech případech je schopnost volajícího procesu poskytnout vlastní kód pro řešení situací, jako jsou porušení sdílení, přepsání souborů nebo určení, zda je soubor platný před zavřením dialogového okna. Některé z těchto případů jsou popsány v této části.
OnFileOk
Tato metoda se volá poté, co uživatel vybere položku, těsně před zavření dialogového okna. Aplikace pak může volat IFileDialog::GetResult nebo IFileOpenDialog::GetResults tak, jak by bylo provedeno po zavření dialogového okna. Pokud je zvolená položka přijatelná, mohou vrátit S_OK. V opačném případě vrátí S_FALSE a zobrazí uživatelské rozhraní, které uživateli řekne, proč vybraná položka není platná. Pokud se vrátí S_FALSE, dialogové okno se nezavře.
Volající proces může použít popisovač okna samotného dialogového okna jako nadřazený prvek uživatelského rozhraní. Tento popisovač lze získat prvním voláním IOleWindow::QueryInterface a následným voláním IOleWindow::GetWindow s popisovačem, jak je znázorněno v tomto příkladu.
HRESULT CDialogEventHandler::OnFileOk(IFileDialog *pfd)
{
IShellItem *psiResult;
HRESULT hr = pfd->GetResult(&psiResult);
if (SUCCEEDED(hr))
{
SFGAOF attributes;
hr = psiResult->GetAttributes(SFGAO_COMPRESSED, &attributes);
if (SUCCEEDED(hr))
{
if (attributes & SFGAO_COMPRESSED)
{
// Accept the file.
hr = S_OK;
}
else
{
// Refuse the file.
hr = S_FALSE;
_DisplayMessage(pfd, L"Not a compressed file.");
}
}
psiResult->Release();
}
return hr;
};
HRESULT CDialogEventHandler::_DisplayMessage(IFileDialog *pfd, PCWSTR pszMessage)
{
IOleWindow *pWindow;
HRESULT hr = pfd->QueryInterface(IID_PPV_ARGS(&pWindow));
if (SUCCEEDED(hr))
{
HWND hwndDialog;
hr = pWindow->GetWindow(&hwndDialog);
if (SUCCEEDED(hr))
{
MessageBox(hwndDialog, pszMessage, L"An error has occurred", MB_OK);
}
pWindow->Release();
}
return hr;
}
OnShareViolation a OnOverwrite
Pokud se uživatel rozhodne přepsat soubor v dialogovém okně Uložit , nebo pokud se soubor, který je uložený nebo nahrazený, používá a nelze jej zapsat (porušení sdílení), může aplikace poskytnout vlastní funkce pro přepsání výchozího chování dialogového okna. Ve výchozím nastavení se při přepsání souboru zobrazí v dialogovém okně výzva, která uživateli umožní tuto akci ověřit. V případě porušení sdílení se ve výchozím nastavení v dialogovém okně zobrazí chybová zpráva, která se nezavře a uživatel se musí rozhodnout jinak. Volající proces může tyto výchozí hodnoty přepsat a v případě potřeby zobrazit vlastní uživatelské rozhraní. Dialogové okno může být instruováno, aby soubor odmítl a zůstal otevřený nebo jej přijal a úspěšně zavřel.
Přizpůsobení dialogového okna
Do dialogového okna lze přidat různé ovládací prvky bez zadání šablony dialogového okna Win32. Mezi tyto ovládací prvky patří PushButton, ComboBox, EditBox, CheckButton, RadioButton seznamy, Skupiny, Oddělovače a statické textové ovládací prvky. Zavolejte QueryInterface na objektu dialogového okna (IFileDialog, IFileOpenDialog nebo IFileSaveDialog), abyste získali ukazatel na IFileDialogCustomize. Toto rozhraní použijte k přidání ovládacích prvků. Každý ovládací prvek má přidružené ID zadané volajícím a také viditelný a povolený stav, který lze nastavit volajícím procesem. Některé ovládací prvky, například PushButton, mají také přidružený text.
Do „vizuální skupiny“ lze přidat více ovládacích prvků, která se v rámci rozvržení dialogového okna přesouvá jako jeden celek. Skupiny mohou mít přiřazený štítek.
Ovládací prvky lze přidat pouze před zobrazením dialogového okna. Jakmile se ale dialogové okno zobrazí, můžou být ovládací prvky skryté nebo zobrazené podle potřeby, například v reakci na akci uživatele. Následující příklady ukazují, jak do dialogového okna přidat seznam přepínačů.
// Controls
#define CONTROL_GROUP 2000
#define CONTROL_RADIOBUTTONLIST 2
#define CONTROL_RADIOBUTTON1 1
#define CONTROL_RADIOBUTTON2 2 // It is OK for this to have the same ID
// as CONTROL_RADIOBUTTONLIST, because it
// is a child control under CONTROL_RADIOBUTTONLIST
// This code snippet demonstrates how to add custom controls in the Common File Dialog.
HRESULT AddCustomControls()
{
// CoCreate the File Open Dialog object.
IFileDialog *pfd = NULL;
HRESULT hr = CoCreateInstance(CLSID_FileOpenDialog,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pfd));
if (SUCCEEDED(hr))
{
// Create an event handling object, and hook it up to the dialog.
IFileDialogEvents *pfde = NULL;
DWORD dwCookie = 0;
hr = CDialogEventHandler_CreateInstance(IID_PPV_ARGS(&pfde));
if (SUCCEEDED(hr))
{
// Hook up the event handler.
hr = pfd->Advise(pfde, &dwCookie);
if (SUCCEEDED(hr))
{
// Set up a Customization.
IFileDialogCustomize *pfdc = NULL;
hr = pfd->QueryInterface(IID_PPV_ARGS(&pfdc));
if (SUCCEEDED(hr))
{
// Create a Visual Group.
hr = pfdc->StartVisualGroup(CONTROL_GROUP, L"Sample Group");
if (SUCCEEDED(hr))
{
// Add a radio-button list.
hr = pfdc->AddRadioButtonList(CONTROL_RADIOBUTTONLIST);
if (SUCCEEDED(hr))
{
// Set the state of the added radio-button list.
hr = pfdc->SetControlState(CONTROL_RADIOBUTTONLIST,
CDCS_VISIBLE | CDCS_ENABLED);
if (SUCCEEDED(hr))
{
// Add individual buttons to the radio-button list.
hr = pfdc->AddControlItem(CONTROL_RADIOBUTTONLIST,
CONTROL_RADIOBUTTON1,
L"Change Title to ABC");
if (SUCCEEDED(hr))
{
hr = pfdc->AddControlItem(CONTROL_RADIOBUTTONLIST,
CONTROL_RADIOBUTTON2,
L"Change Title to XYZ");
if (SUCCEEDED(hr))
{
// Set the default selection to option 1.
hr = pfdc->SetSelectedControlItem(CONTROL_RADIOBUTTONLIST,
CONTROL_RADIOBUTTON1);
}
}
}
}
// End the visual group.
pfdc->EndVisualGroup();
}
pfdc->Release();
}
if (FAILED(hr))
{
// Unadvise here in case we encounter failures
// before we get a chance to show the dialog.
pfd->Unadvise(dwCookie);
}
}
pfde->Release();
}
if (SUCCEEDED(hr))
{
// Now show the dialog.
hr = pfd->Show(NULL);
if (SUCCEEDED(hr))
{
//
// You can add your own code here to handle the results.
//
}
// Unhook the event handler.
pfd->Unadvise(dwCookie);
}
pfd->Release();
}
return hr;
}
Přidání možností do tlačítka OK
Podobně lze volby přidat na tlačítka Otevřít nebo Uložit , což je tlačítko OK pro příslušné typy dialogů. Možnosti jsou přístupné prostřednictvím rozevíracího seznamu připojeného k tlačítku. První položka v seznamu se stane textem tlačítka. Následující příklad ukazuje, jak poskytnout tlačítko Otevřít se dvěma možnostmi: " Otevřít " a "Otevřít jako jen pro čtení".
// OpenChoices options
#define OPENCHOICES 0
#define OPEN 0
#define OPEN_AS_READONLY 1
HRESULT AddOpenChoices()
{
// CoCreate the File Open Dialog object.
IFileDialog *pfd = NULL;
HRESULT hr = CoCreateInstance(CLSID_FileOpenDialog,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pfd));
if (SUCCEEDED(hr))
{
// Create an event handling object, and hook it up to the dialog.
IFileDialogEvents *pfde = NULL;
DWORD dwCookie = 0;
hr = CDialogEventHandler_CreateInstance(IID_PPV_ARGS(&pfde));
if (SUCCEEDED(hr))
{
// Hook up the event handler.
hr = pfd->Advise(pfde, &dwCookie);
if (SUCCEEDED(hr))
{
// Set up a Customization.
IFileDialogCustomize *pfdc = NULL;
hr = pfd->QueryInterface(IID_PPV_ARGS(&pfdc));
if (SUCCEEDED(hr))
{
hr = pfdc->EnableOpenDropDown(OPENCHOICES);
if (SUCCEEDED(hr))
{
hr = pfdc->AddControlItem(OPENCHOICES, OPEN, L"&Open");
}
if (SUCCEEDED(hr))
{
hr = pfdc->AddControlItem(OPENCHOICES,
OPEN_AS_READONLY,
L"Open as &read-only");
}
if (SUCCEEDED(hr))
{
pfd->Show(NULL);
}
}
pfdc->Release();
}
pfd->Unadvise(dwCookie);
}
pfde->Release();
}
pfd->Release();
return hr;
}
Volbu uživatele lze ověřit po návratu dialogového okna z metody Show jako pro ComboBox, nebo ji lze ověřit jako součást zpracování pomocí IFileDialogEvents::OnFileOk.
Reakce na události v přidaných ovládacích prvcích
Obslužná rutina událostí poskytovaná volajícím procesem může implementovat IFileDialogControlEvents kromě IFileDialogEvents. IFileDialogControlEvents umožňuje volajícímu procesu reagovat na tyto události:
- Na tlačítko PushButton bylo kliknuto
- Změna stavu checkbuttonu
- Položka vybraná v nabídce, seznamu ComboBox nebo RadioButton
- Probíhá aktivace ovládání. Tato zpráva se odešle, když se má zobrazit rozevírací seznam, pokud volající proces chce změnit položky v seznamu.
Úplné ukázky
Následují kompletní ukázky jazyka C++ ke stažení ze sady Windows Software Development Kit (SDK), které demonstrují použití dialogového okna Společné položky a interakci s tím.
Příbuzná témata