Windows Vistaスタイルのファイルを開く/保存するダイアログを表示する

test80.gif
Windows Vistaでは「ファイルを開く」と「ファイルを保存する」ダイアログが一新された。しかしGetOpenFileName、GetSaveFileNameを利用した場合は従来通りのスタイルで表示されてしまう。

新しいダイアログスタイルを利用したい場合はIFileDialogを利用する。ここではとりあえずこのダイアログを開くための関数を用意した。実際にプログラム内での実装に使う場合は、さらにフィルターなどの設定コードを追加する必要がある。

依存環境:ATL
#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();
}

プロジェクトファイルをダウンロード


カテゴリー「コモンダイアログ」 のエントリー