![]()
「ファイルを開く」や「ファイルを保存」ダイアログはそれぞれ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,_T("%s\1%s\1"),pszFilterName,pszFilterExt);
else if(pszFilterExt)
::_stprintf_s(pszFilter,2048,_T("%s\1%s\1"),pszFilterExt,pszFilterExt);
else if(bUseAllFilter == false)
return false;
if(bUseAllFilter)
{
if(pszFilter[0])
::_tcscat_s(pszFilter,2048,_T("All file\1*.*\1"));
else
::_stprintf_s(pszFilter,2048,_T("All file\1*.*\1"));
}
else
::_tcscat_s(pszFilter,2048,_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);
}
