/////////////////////////////////////////
// ウィンドウ基本クラスCWND定義ファイル
/////////////////////////////////////////

class CWND
{
public:		//メンバー変数
	HWND		m_hWnd;			//ウィンドウハンドル
	HWND		m_hParent;		//親ウィンドウハンドル
	HINSTANCE	m_hInstance;	//インスタンス変数
	//CreateEx用情報
	DWORD 		m_dwExStyle;
	LPCTSTR		m_lpClassName;
	LPCTSTR		m_lpWindowName;
	DWORD		m_dwStyle;
	int			m_x;
	int			m_y;
	int			m_Width;
	int			m_Height;
	HMENU		m_hMenu;
	LPVOID		m_lpParam;

public:		//メンバー関数
	CWND();									//コンストラクター
	~CWND();								//デコンストラクター
	virtual bool Init(LPCTSTR, HINSTANCE,
						WNDPROC, LPCTSTR,
						LPCTSTR, LPCTSTR,
						HBRUSH);			//ウィンドウ初期化関数
	virtual bool Create(LPCTSTR, DWORD,
						DWORD, HWND,
						int, int, int,
						int, int);			//ウィンドウ作成関数
	HWND GetHandle() {return m_hWnd;}		//ウィドウハンドルを返す
	void SetHandle(HWND hWnd)
						{m_hWnd = hWnd;}	//ウィンドウハンドルを設定
	HINSTANCE GetInstance()
					{return m_hInstance;}	//インスタンスを取る
	void SetInstance(HINSTANCE hInst)
					{m_hInstance = hInst;}	//インスタンスを設定
	LRESULT SendMsg(UINT, WPARAM, LPARAM);	//ウィンドウへのメッセージ
	LRESULT SendItemMsg(int, UINT,
						WPARAM, LPARAM);	//ウィンドウコントロールへのメッセージ
};

//////////////////////
// メンバー関数の実装
//////////////////////
//コンストラクター(初期化のみ）
CWND::CWND() {

	m_hWnd = 0;
	m_dwExStyle		= 0;
	m_lpClassName	= NULL;
	m_lpWindowName	= NULL;
	m_dwStyle		= WS_OVERLAPPEDWINDOW;
	m_x				= CW_USEDEFAULT;
	m_y				= CW_USEDEFAULT;
	m_Width			= CW_USEDEFAULT;
	m_Height		= CW_USEDEFAULT;
	m_hParent		= NULL;
	m_hMenu			= NULL;
	m_hInstance		= 0;
	m_lpParam		= NULL;
}

//デストラクター
CWND::~CWND() {
}

//初期化関数（ウィンドウ用）
bool CWND::Init(LPCTSTR ClassName, HINSTANCE hInstance, WNDPROC Proc,
				LPCTSTR Menu = NULL,
				LPCTSTR Icon = "IDI_ICON",
				LPCTSTR cur = IDC_ARROW,
				HBRUSH brush = (HBRUSH)(COLOR_WINDOW + 1)) {

	WNDCLASSEX WndClass;
	//ウィンドウクラスの登録
	WndClass.cbSize		= sizeof(WNDCLASSEX);			//この構造体のサイズ
	WndClass.style		= CS_HREDRAW | CS_VREDRAW;		//縦横移動、サイズ変更時再描画
	WndClass.lpfnWndProc= Proc;							//コールバック関数ポインター
	WndClass.cbClsExtra	= 0;							//この構造体以降に置くバイト数
	WndClass.cbWndExtra	= 0;							//インスタンス以降に置くバイト数
	WndClass.hInstance	= m_hInstance = hInstance;		//このウィンドウのインスタンス
	WndClass.hIcon		= LoadIcon(hInstance, Icon);	//このウィンドウクラスのアイコン
	WndClass.hCursor	= LoadCursor(NULL, cur);		//このウィンドウクラスのカーソル
	WndClass.hbrBackground	= brush;					//このウィンドウクラスの背景色
	WndClass.lpszMenuName	= Menu;						//このウィンドウクラスのメニュー
	WndClass.lpszClassName	= m_lpClassName
							= ClassName;				//このウィンドウクラスの名称
	WndClass.hIconSm	= LoadIcon(hInstance, Icon);	//最小化時の小さいアイコン
	if(!RegisterClassEx(&WndClass)) {
		MessageBox(0, "ウィンドウを登録できませんでした。", "エラー",
				MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);
		return FALSE;
	}
	return TRUE;
}

//ウィンドウ作成関数
bool CWND::Create(LPCTSTR WindowName = "MainWindow",
				DWORD Style = WS_OVERLAPPEDWINDOW, DWORD ExStyle = NULL,
				HWND hParent = NULL, int hMenu = NULL,
				int x = CW_USEDEFAULT, int y = CW_USEDEFAULT,
				int w = CW_USEDEFAULT, int h = CW_USEDEFAULT) {

	m_hWnd = CreateWindowEx(m_dwExStyle = ExStyle,
					    	m_lpClassName,
							m_lpWindowName = WindowName,
							m_dwStyle = Style,
							m_x = x,
							m_y = y,
							m_Width = w,
							m_Height = h,
							m_hParent = hParent,
							m_hMenu = (HMENU)hMenu,
							m_hInstance,
							m_lpParam
	);
	if(m_hWnd == NULL) {
		MessageBox(0, "ウィンドウを作れませんでした!", "エラー",
				MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);
		return FALSE;
	}
	//ウィンドウの表示と再描画
	ShowWindow(m_hWnd, SW_SHOWNORMAL);
	UpdateWindow(m_hWnd);
	return TRUE;
}

//コントロールへのへのメッセージ
LRESULT CWND::SendMsg(UINT Msg, WPARAM wParam, LPARAM lParam) {

	return SendMessage(m_hWnd, Msg, wParam, lParam);
}

//ウィンドウコントロールへのへのメッセージ
LRESULT CWND::SendItemMsg(int ID, UINT Msg, WPARAM wParam, LPARAM lParam) {

	return SendDlgItemMessage(m_hWnd, ID, Msg, wParam, lParam);
}
