ファイルを開く/保存するダイアログを表示する

test65.gif
「ファイルを開く」や「ファイルを保存」ダイアログはそれぞれGetOpenFileName、GetSaveFileNameで表示することができる。これらの関数は引数にOPENFILENAME構造体を使う。
OPENFILENAMEにより複数ファイルを開くなどさまざまな処理が可能だが、ここでは普段利用するであろう機能に絞って実装した。

#include "atlstr.h"


#include "commdlg.h"


//
//	ファイルを開く/保存するダイアログ表示
//
//bSaveDialog==trueで保存用、falseで開くためのダイアログを表示
//pszInitFolerで初期選択フォルダ指定(ex._T("d:\\"))
//pszFilterExt、pszFilterNameでファイルの拡張子指定(ex.pszFilterExt=_T("*.txt")、pszFilterName=_T("テキストファイル"))
//bUseAllFilter==trueで全てのファイル(*.*)を使うかどうかの指定
//pszTitleでダイアログタイトルの指定
//
bool	ShowFileOpenSaveDialog(HWND hParentWnd,CAtlString* pstrFileName,bool bSaveDialog,LPCTSTR pszInitFoler=NULL,LPCTSTR pszFilterExt=NULL,LPCTSTR pszFilterName=NULL,bool bUseAllFilter=true,LPCTSTR pszTitle=NULL)
{
	BOOL			ret;
	TCHAR			pszName[2048];
	TCHAR			pszFilter[2048];
	OPENFILENAME	sOpenFileName;

	if(pstrFileName == NULL)
		return	false;
	*pstrFileName = _T("");

	/////////////////////////////////
	//フィルター作成
	//

	//\0の代わりに\1を使っていることに注意!
	pszFilter[0] = NULL;
	if(pszFilterExt && pszFilterName)
		::_stprintf_s(pszFilter,2048 * sizeof(TCHAR),_T("%s\1%s\1"),pszFilterName,pszFilterExt);
	else if(pszFilterExt)
		::_stprintf_s(pszFilter,2048 * sizeof(TCHAR),_T("%s\1%s\1"),pszFilterExt,pszFilterExt);
	else if(bUseAllFilter == false)
		return	false;

	if(bUseAllFilter)
	{
		if(pszFilter[0])
			::_tcscat_s(pszFilter,2048 * sizeof(TCHAR),_T("All file\1*.*\1"));
		else
			::_stprintf_s(pszFilter,2048 * sizeof(TCHAR),_T("All file\1*.*\1"));
	}
	else
		::_tcscat_s(pszFilter,2048 * sizeof(TCHAR),_T("\1"));

	//\1を\0に置換
	{
		size_t	i;
		size_t	nSize;

		nSize = ::_tcslen(pszFilter);
		for(i = 0; i < nSize; i++)
		{
			if(pszFilter[i] == '\1')
				pszFilter[i] = '\0';
		}
	}

	/////////////////////////////////
	//パラメータ初期化
	//
	pszName[0] = NULL;
	::ZeroMemory(&sOpenFileName,sizeof(OPENFILENAME));
	sOpenFileName.lStructSize	= sizeof(OPENFILENAME);
	sOpenFileName.hwndOwner		= hParentWnd;
	sOpenFileName.lpstrFile		= pszName;
	sOpenFileName.nMaxFile		= 2048;
	sOpenFileName.lpstrFilter	= pszFilter;
	sOpenFileName.nFilterIndex	= 1;
	sOpenFileName.lpstrTitle	= pszTitle;
	sOpenFileName.nMaxFileTitle	= pszTitle ? (DWORD)::_tcslen(pszTitle) : 0;
	sOpenFileName.lpstrInitialDir = pszInitFoler;
	sOpenFileName.Flags			= OFN_PATHMUSTEXIST | OFN_DONTADDTORECENT | OFN_EXPLORER | (bSaveDialog ? OFN_OVERWRITEPROMPT : OFN_FILEMUSTEXIST);


	/////////////////////////////////
	//ダイアログ表示
	//
	if(bSaveDialog)
		ret = ::GetSaveFileName(&sOpenFileName);
	else
		ret = ::GetOpenFileName(&sOpenFileName);

	if(ret == FALSE)
		return	false;

	*pstrFileName = pszName;

	return	true;
}



void	Test(void)
{
	bool		ret;
	CAtlString	strFile;

	ret = ShowFileOpenSaveDialog(NULL,&strFile,true,_T("d:"),_T("*.txt"),_T("テキストファイル"));

	if(ret)
		::MessageBox(NULL,strFile,_T(""),MB_OK);
}

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


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