예제 #1
0
        public bool ShowDialog(IntPtr ownerWindow)
        {
            //	オーナーウィンドウを正規化する
            ownerWindow = GetSafeOwnerWindow(ownerWindow);

            //	ダイアログインターフェースを構築
            IFileOpenDialog dlg = new FileOpenDialog() as IFileOpenDialog;              //	IUnknown::QueryInterfaceを使ってインターフェースを特定する

            try
            {
                //	フォルダ選択モードに切り替え
                dlg.SetOptions(FOS.FORCEFILESYSTEM | FOS.PICKFOLDERS);
                //	以前選択されていたフォルダを指定
                bool       setFolder = false;
                IShellItem item      = CreateItem(SelectedPath);
                if (item != null)
                {
                    dlg.SetFolder(item);
                    Marshal.ReleaseComObject(item);
                    setFolder = true;
                }
                //	まだフォルダを設定していない場合は初期フォルダを設定する
                if (!setFolder)
                {
                    item = CreateItem(InitialFolder);
                    if (item != null)
                    {
                        dlg.SetFolder(item);
                        Marshal.ReleaseComObject(item);
                    }
                }
                //	タイトル
                if (!string.IsNullOrWhiteSpace(Title))
                {
                    dlg.SetTitle(Title);
                }
                //	ショートカット追加
                foreach (var place in m_places)
                {
                    item = CreateItem(place.folder);
                    if (item != null)
                    {
                        dlg.AddPlace(item, place.fdap);
                        Marshal.ReleaseComObject(item);
                    }
                }
                //	ダイアログを表示
                var hRes = dlg.Show(ownerWindow);
                if (NativeMethods.SUCCEEDED(hRes))
                {
                    item         = dlg.GetResult();
                    SelectedPath = item.GetName(SIGDN.FILESYSPATH);
                    Marshal.ReleaseComObject(item);
                    return(true);
                }
            }
            finally
            {
                Marshal.ReleaseComObject(dlg);
            }
            return(false);
        }