Win32 App Example The Open Dialog Box - yoshimune/LearningDirectX11 GitHub Wiki
This page refers to 【Example: The Open Dialog Box】
Shape
の例は幾分複雑になっていました。実際のWindowsプログラムで使用する可能性のあるCOMオブジェクト、Open dialog boxを見てみましょう
「Open dialog box」を見せるには、プログラムでCommon Item DialogオブジェクトとよばれるCOMオブジェクトを使用します。Common Item DialogはIFileOpenDialogと呼ばれるインターフェイスを実装しています。このインターフェイスはShobjid.hヘッダーファイルで宣言されています。
このプログラムでは、Open dialog boxをユーザーに表示します。もしユーザーがファイルを選択した場合、プログラムはファイル名を含めたダイアログボックスを表示します。
#include <windows.h>
#include <shobjidl.h>
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
{
HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
if (SUCCEEDED(hr))
{
IFileOpenDialog *pFileOpen;
// Create the FileOpenDialog object.
hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_ALL, IID_IFileOpenDialog, reinterpret_cast<void**>(&pFileOpen));
if (SUCCEEDED(hr))
{
// Shoe the Open dialog box.
hr = pFileOpen->Show(NULL);
// Get the file name from the dialog box.
if (SUCCEEDED(hr))
{
IShellItem *pItem;
hr = pFileOpen->GetResult(&pItem);
if (SUCCEEDED(hr))
{
LPWSTR pszFilePath;
hr = pItem->GetDisplayName(SIGDN_FILESYSPATH, &pszFilePath);
//Display the file name to the user.
if (SUCCEEDED(hr))
{
MessageBox(NULL, pszFilePath, L"File Path", MB_OK);
CoTaskMemFree(pszFilePath);
}
}
pItem->Release();
}
CoUninitialize();
}
}
return 0;
}
ビルドが通らない場合は プロジェクト→構成プロパティ→全般→文字セット→Unicode文字セットを使用する に設定してください。
このコードは後のモジュールで説明するコンセプトをいくつか使っています。なので、全部理解できなくても心配しないでください。ここではコードの基本的な部分を説明します。
- CoInitilizeExを呼び、COMライブラリを初期化する
- CoCreateInstance を呼び、Common Item Dialogを作成、オブジェクトのIFileOpenDialogインターフェースポインタを取得する
- オブジェクトのShowメソッドを呼び出す。これはダイアログボックスをユーザーに表示する。このメソッドはユーザーがダイアログボックスを終了するまでブロックする。
- GetResultメソッドを呼びだす。このメソッドは2つ目のShell item objectと呼ばれるCOMオブジェクトのポインタを返す。IShellItemを実装したShell itemはユーザーが選択したアイテムを返却します。
- Shellアイテムの GetDisplayName メソッドを呼び出します。このメソッドはファイルパスをstringに格納する
- ファイルパスを記したメッセージボックスを表示する
- CoUninitialize を呼び出し、COMライブラリを終了させる
1,2,7はCOMライブラリの定義に関わるものです。これらは汎用的なCOM関数です。3,4,5のメソッドはCommon Item Dialogオブジェクトの定義に関わるものです。
この例ではオブジェクト作成の種類(汎用CoCreateInstance関数)とCommon Item Dialog オブジェクトに指示をだすメソッドを説明しました。