////////////////////////////////////////
// CMNDLGWクラスヘッダー（定義ファイル）
// 注：使用時は"wchar.h"を読み込むこと
////////////////////////////////////////

class CMNDLGW
{
public:	//メンバー変数
	WCHAR		m_FileName[MAX_PATH] = {0};	//ファイル名の格納場所
   	WCHAR		m_Path[MAX_PATH] = {0};		//ファイルパスの格納場所
	COLORREF	m_Color = 0;				//色の格納場所
	HFONT		m_Font = 0;					//フォントハンドルの格納場所

public:	//メンバー関数
	~CMNDLGW();							//デストラクター
	WCHAR* GetFileName(HWND, WCHAR*, bool, WCHAR*, WCHAR*, WCHAR*, DWORD);
	COLORREF GetColor(HWND);
	HFONT GetFont(HWND);
	WCHAR* GetPath(HWND, WCHAR*);
};

//デストラクター
CMNDLGW::~CMNDLGW() {
	if(m_Font)
		DeleteObject(m_Font);
}

WCHAR* CMNDLGW::GetFileName(HWND hWnd, WCHAR* Filter, bool Open = TRUE,
				WCHAR* Ext = NULL, WCHAR* IniDir = NULL, WCHAR* Title = NULL,
				DWORD Flag = OFN_EXPLORER | OFN_FILEMUSTEXIST | 
				OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT) {

	if(IniDir)	*m_FileName = NULL;	//m_FileNameが初期化されている必要がある
	bool success = FALSE;
	OPENFILENAMEW ofn;				//オープンファイルダイアログ構造体
	ZeroMemory(&ofn, sizeof(ofn));	//ゼロ初期化
	ofn.lStructSize		= sizeof(ofn);
	ofn.hwndOwner		= hWnd;
	ofn.lpstrFilter		= Filter;
	ofn.nFilterIndex	= 1;
	ofn.lpstrFile		= m_FileName;
	ofn.nMaxFile		= MAX_PATH;
	ofn.lpstrTitle		= Title;
	ofn.lpstrInitialDir = IniDir;
	ofn.Flags			= Flag;
	ofn.lpstrDefExt		= Ext;
	if(Open)
		success = GetOpenFileNameW(&ofn);
    else
		success = GetSaveFileNameW(&ofn);
	if(success)		return m_FileName;
	else			return L'\0';
}

COLORREF CMNDLGW::GetColor(HWND hWnd) {

	static	CHOOSECOLOR clr;
	static	COLORREF cref[16];

	clr.lStructSize		= sizeof(CHOOSECOLOR);
	clr.hwndOwner		= hWnd;
	clr.hInstance		= 0;
	clr.rgbResult		= m_Color; //CC_RGBINITフラッグがあるとこれがデフォルトになる
	clr.lpCustColors	= cref;
	clr.Flags			= CC_RGBINIT;
	clr.lCustData		= 0L;
	clr.lpfnHook		= NULL;
	clr.lpTemplateName	= NULL;
	if(ChooseColor(&clr))
		return (m_Color = clr.rgbResult);
	 else
     	return NULL;
}

HFONT CMNDLGW::GetFont(HWND hWnd) {

	if(m_Font)
    	DeleteObject(m_Font);
	//フォント情報をChooseFontダイアログ構造体から得る
	static	CHOOSEFONT	cf;
	static	LOGFONT		lf;
	cf.lStructSize		= sizeof(CHOOSEFONT);
	cf.hwndOwner		= hWnd;
	cf.hDC				= 0;
	cf.lpLogFont		= &lf; //選択の結果はここに入る
	cf.iPointSize		= 12;
	cf.Flags			= CF_EFFECTS | CF_SCREENFONTS;
	cf.rgbColors		= 0; //フォント色−ダイアログでも使われる
	cf.lCustData		= 0L;
	cf.lpfnHook			= NULL;
	cf.lpTemplateName	= NULL;
	cf.hInstance		= 0;
	cf.lpszStyle		= NULL;
	cf.nFontType		= SCREEN_FONTTYPE | REGULAR_FONTTYPE | BOLD_FONTTYPE | ITALIC_FONTTYPE;
	cf.nSizeMin			= 0;
	cf.nSizeMax			= 0;
	if(!ChooseFont(&cf)) 	//CHOOSEFONT構造体へのポインター
		return NULL;
	return (m_Font = CreateFontIndirect(cf.lpLogFont));
}

WCHAR* CMNDLGW::GetPath(HWND hWnd, WCHAR* Title = L"フォールダーの選択") {

	BROWSEINFOW BrowsingInfo;
	PIDLIST_ABSOLUTE ItemID;
	ZeroMemory(&BrowsingInfo, sizeof(BROWSEINFOW));
	BrowsingInfo.hwndOwner		= hWnd;
	BrowsingInfo.pszDisplayName	= m_Path;
	BrowsingInfo.lpszTitle		= Title;
	BrowsingInfo.ulFlags		= BIF_USENEWUI;	//CoInitialize関数によるCOM初期化必要
	ItemID = SHBrowseForFolderW(&BrowsingInfo);
	if(SHGetPathFromIDListW(ItemID, m_Path)) {
		GlobalFreePtr(ItemID);
		return m_Path;
	}
	else
		return L'\0';
}
