///////////////////////////////////////
// CMNDLGクラスヘッダー（定義ファイル）
///////////////////////////////////////

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

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

//コンストラクター
CMNDLG::CMNDLG() {
	*m_FileName = NULL;
	m_Color = 0;
	m_Font = 0;
}

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

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

	if(IniDir)	*m_FileName = NULL;	//m_FileNameが初期化されている必要がある
	bool success = FALSE;
	OPENFILENAME 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 = GetOpenFileName(&ofn);
    else
		success = GetSaveFileName(&ofn);
	if(success)		return m_FileName;
	else			return 0;
}

COLORREF CMNDLG::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 CMNDLG::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));
}

char* CMNDLG::GetPath(HWND hWnd, char* Title) {

	BROWSEINFO BrowsingInfo;
	LPITEMIDLIST ItemID;
	ZeroMemory(&BrowsingInfo, sizeof(BROWSEINFO));
	BrowsingInfo.hwndOwner		= hWnd;
	BrowsingInfo.pszDisplayName	= m_Path;
	BrowsingInfo.lpszTitle		= Title;
	BrowsingInfo.ulFlags		= BIF_USENEWUI;	//CoInitialize関数によるCOM初期化必要
	ItemID=SHBrowseForFolder(&BrowsingInfo);
	if(SHGetPathFromIDList(ItemID, m_Path)) {
		GlobalFreePtr(ItemID);
		return m_Path;
	}
	else
		return NULL;
}
