#if !defined(AFX_DIALOGEX_H__880F3161_C7F1_4A36_928B_FE7A2DD8CB18__INCLUDED_)
#define AFX_DIALOGEX_H__880F3161_C7F1_4A36_928B_FE7A2DD8CB18__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// MwlmfcDialogEx.h : ヘッダー ファイル
//

template <typename T> class CModelessDialogPack;

/////////////////////////////////////////////////////////////////////////////
// CMwlmfcDialogEx ダイアログ

class CMwlmfcDialogEx : public CDialog
{
	friend CModelessDialogPack;
// コンストラクション
private:
	void CMwlmfcDialogEx_Clear(){
		m_nIDD = -1;
		m_bIsAlready = FALSE;
		m_ppThisInstance = NULL;
		m_bModeless = false;
	}
public:
	//CMwlmfcDialogEx(CWnd* pParent = NULL);   // 標準のコンストラクタ
	//CMwlmfcDialogEx(LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL);
	CMwlmfcDialogEx(){ CMwlmfcDialogEx_Clear(); }
	CMwlmfcDialogEx(UINT nIDTemplate, CWnd* pParentWnd = NULL)
		: CDialog( nIDTemplate, pParentWnd )
	{
		CMwlmfcDialogEx_Clear();
		//m_pParentWnd = pParentWnd;
		//m_bIsAlready = FALSE;	<-- Clear()で呼ぶよん

		m_nIDD = nIDTemplate;
	}

//	メンバメソッド
public:
	//int DoModeless( CMwlmfcDialogEx** ppThisInstance=NULL );	-> friend化
	BOOL LoadAccelerators( int nIdAclResource ){ return LoadAccelerators( MAKEINTRESOURCE(nIdAclResource) ); }
	BOOL LoadAcl( int nIdAclResource ){ return LoadAccelerators( MAKEINTRESOURCE(nIdAclResource) ); }
	BOOL LoadAccelerators( LPCSTR lpTableName ){
		m_hAcl = ::LoadAccelerators( AfxGetInstanceHandle(), lpTableName );
		if ( m_hAcl == NULL )
			return FALSE;
		return TRUE;
	}
	BOOL LoadAcl( LPCSTR lpTableName ){ return LoadAccelerators(lpTableName); }

// ダイアログ データ
	//{{AFX_DATA(CMwlmfcDialogEx)
	//enum { IDD }=0;
		// メモ: ClassWizard はこの位置にデータ メンバを追加します。
	//}}AFX_DATA

// オーバーライド
	// ClassWizard は仮想関数のオーバーライドを生成します。
	//{{AFX_VIRTUAL(CMwlmfcDialogEx)
	public:
	virtual BOOL PreTranslateMessage(MSG* pMsg);
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV サポート
	virtual void PostNcDestroy();
	//}}AFX_VIRTUAL

// インプリメンテーション
protected:
	int DoModeless( CMwlmfcDialogEx** ppThisInstance=NULL );

	// 生成されたメッセージ マップ関数
	//{{AFX_MSG(CMwlmfcDialogEx)
	afx_msg void OnClose();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
	//virtual void OnOK();
	//virtual void OnCancel();

	HACCEL m_hAcl;	//	キーボードアクセレータ

private:
	int m_nIDD;
	BOOL m_bIsAlready;
	CMwlmfcDialogEx **m_ppThisInstance;
	bool m_bModeless;
	//CWnd* m_pParentWnd; <-- CDialogが既に持ってる

	void DestroyCommon();
};


/////////////////////////////////////////////////////////////////////////////////

//	モードレスパック
template <typename TMwlmfcDialogEx> class CModelessDialogPack : public TMwlmfcDialogEx
{
private:
	TMwlmfcDialogEx *m_pMwlmfcDialogEx;	//	実態

public:
	//	コンストラクタ
	CModelessDialogPack(){ m_pMwlmfcDialogEx=NULL; }

	//	デストラクタ
	virtual ~CModelessDialogPack(){
		SAFE_DELETE( m_pMwlmfcDialogEx );
	}

	//	モードレス実行！
	int DoModeless(){ return Do(); }
	int Do()
	{
		//	無ければ or 前回閉じられていれば
		if ( m_pMwlmfcDialogEx == NULL )
			m_pMwlmfcDialogEx = new TMwlmfcDialogEx;

		//	ダイアログ表示（もしくは既にあればFocusが移る）
		//return m_pMwlmfcDialogEx->DoModeless( &m_pMwlmfcDialogEx );  <-- テンプレートはclassのキャストが無理だとか…？
		return m_pMwlmfcDialogEx->DoModeless( (CMwlmfcDialogEx **)&m_pMwlmfcDialogEx );

		/*
		if ( m_pMwlmfcDialogEx == NULL )
		{
			m_pMwlmfcDialogEx = new TMwlmfcDialogEx;
			m_pMwlmfcDialogEx->DoModeless( &m_pMwlmfcDialogEx );
		}
		else
		{
		}
		*/
	}

	//	各種取得
	TMwlmfcDialogEx& This(){ return *m_pMwlmfcDialogEx; }
	TMwlmfcDialogEx& operator ->(){ return *m_pMwlmfcDialogEx; }	//	危険か…？
	TMwlmfcDialogEx* ThisPtr(){ return m_pMwlmfcDialogEx; }
};

namespace mwlmfc{
	typedef CMwlmfcDialogEx CDialogEx;
}//namespace mwlmfc

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ は前行の直前に追加の宣言を挿入します。

#endif // !defined(AFX_DIALOGEX_H__880F3161_C7F1_4A36_928B_FE7A2DD8CB18__INCLUDED_)
