![]()
Windows Vistaでは「ファイルを開く」と「ファイルを保存する」ダイアログが一新された。しかしGetOpenFileName、GetSaveFileNameを利用した場合は従来通りのスタイルで表示されてしまう。
新しいダイアログスタイルを利用したい場合はIFileDialogを利用する。ここではとりあえずこのダイアログを開くための関数を用意した。実際にプログラム内での実装に使う場合は、さらにフィルターなどの設定コードを追加する必要がある。
#include "atlstr.h"
#include "shobjidl.h"
//
// Windows Vista風のファイル読み込み/保存ダイアログ
//
//初期フォルダやフィルタ設定はしていない簡易版
//
//IFileDialogを利用。Windows Vista以降対応
//
bool ShowOpenSaveFileDialog(HWND hParentWnd,bool bOpen,CAtlString* pstrFile)
{
HRESULT hr;
IFileDialog* pIFileDialog;
if(pstrFile == NULL)
return false;
*pstrFile = _T("");
pIFileDialog = NULL;
hr = ::CoCreateInstance(bOpen ? CLSID_FileOpenDialog : CLSID_FileSaveDialog,NULL,CLSCTX_INPROC_SERVER,IID_IFileDialog,(void**)&pIFileDialog);
if(FAILED(hr) || pIFileDialog == NULL)
return false;
//本当はここで初期フォルダやフィルターなどのオプションを設定する
hr = pIFileDialog->Show(hParentWnd);
if(SUCCEEDED(hr))
{
WCHAR* pszName;
IShellItem* pIShellItem;
pszName = NULL;
pIShellItem = NULL;
hr = pIFileDialog->GetResult(&pIShellItem);
if(SUCCEEDED(hr))
hr = pIShellItem->GetDisplayName(SIGDN_FILESYSPATH,&pszName);
if(SUCCEEDED(hr))
{
*pstrFile = pszName;
::CoTaskMemFree(pszName);
}
if(pIShellItem)
pIShellItem->Release();
}
pIFileDialog->Release();
return SUCCEEDED(hr) ? true : false;
}
void Test2(void)
{
CAtlString strFile;
ShowOpenSaveFileDialog(NULL,true,&strFile);
::MessageBox(NULL,strFile,_T(""),MB_OK);
}
void Test(void)
{
::CoInitialize(NULL);
Test2();
::CoUninitialize();
}
