////////////////////////////////////////////////////
//CDEBUGクラス
//BCCSkeltonプログラミング用デバッグツール集
//注意：最初にウィンドウハンドルで初期化する
//		例－debug.Init(m_hWnd);
//Print関数   －プログラム中宣言して確認したい変数を
//				引数に渡し、"printf"と同じ表示フォー
//				マットで表示する
//				対象変数はWCHAR*、WCHAR、整数、長整数
//ErrorMsg関数－GetLastErrorを取得し、FormatMessage
//				の文字列を表示
////////////////////////////////////////////////////
#include	<stdio.h>			//floatとdouble用

class CDEBUG
{
private:
	HWND m_hWnd = NULL;							//対象ウィンドウハンドル
	WCHAR m_Buffer[MAX_PATH * 4];				//表示文字列用バッファー（1,040バイト）
public:
	CDEBUG();									//引数無しコンストラクター
	CDEBUG(HWND);								//引数付きコンストラクター
	void Init(HWND hWnd) {m_hWnd = hWnd;};		//対象ウィンドウハンドルで初期化する
	void Print(char*, WCHAR*, WCHAR*);			//文字列表示用
	void Print(WCHAR*, WCHAR*, WCHAR*);			//Unicode文字列表示用
	void Print(int, WCHAR*, WCHAR*);			//整数表示用
	void Print(long int, WCHAR*, WCHAR*);		//長整数表示用
	void Print(WORD, WCHAR*, WCHAR*);			//符号なし整数表示用
	void Print(DWORD, WCHAR*, WCHAR*);			//符号なし長整数表示用
	void Print(float, WCHAR*, WCHAR*);			//単精度浮動小数点表示用
	void Print(double, WCHAR*, WCHAR*);			//倍精度浮動小数点表示用
	void ErrorMsg();							// ErrorMsg (Error Message) 関数
};

//引数無しコンストラクター
CDEBUG::CDEBUG() {
}

//引数付きコンストラクター
CDEBUG::CDEBUG(HWND hWnd) {
	Init(hWnd);
}

//文字列表示用
void CDEBUG::Print(char* Arg, char* Title = "Debug char*", char* Format = "%s") {

	wsprintfA(m_Buffer, Format, Arg);
	MessageBoxA(m_hWnd, m_Buffer, Title, MB_OK | MB_ICONINFORMATION);
}

//Unicode(UTF-16)文字列表示用
void CDEBUG::Print(WCHAR* Arg, WCHAR* Title = L"Debug WCHAR", WCHAR* Format = L"%s") {

	wsprintfW((WCHAR*)m_Buffer, Format, Arg);
	MessageBoxW(m_hWnd, m_Buffer, Title, MB_OK | MB_ICONINFORMATION);
}

//整数表示用
void CDEBUG::Print(int Arg, WCHAR* Title = L"Debug int", WCHAR* Format = L"%d") {

	wsprintfW(m_Buffer, Format, Arg);
	MessageBoxW(m_hWnd, m_Buffer, Title, MB_OK | MB_ICONINFORMATION);
}

//長整数表示用
void CDEBUG::Print(long int Arg, WCHAR* Title = L"Debug long int", WCHAR* Format = L"%ld") {

	wsprintfW(m_Buffer, Format, Arg);
	MessageBoxW(m_hWnd, m_Buffer, Title, MB_OK | MB_ICONINFORMATION);
}

//符号なし整数表示用
void CDEBUG::Print(WORD Arg, WCHAR* Title = L"Debug WORD", WCHAR* Format = L"%d") {

	wsprintfW(m_Buffer, Format, Arg);
	MessageBoxW(m_hWnd, m_Buffer, Title, MB_OK | MB_ICONINFORMATION);
}

//符号なし長整数表示用
void CDEBUG::Print(DWORD Arg, WCHAR* Title = L"Debug DWORD", WCHAR* Format = L"%ld") {

	wsprintfW(m_Buffer, Format, Arg);
	MessageBoxW(m_hWnd, m_Buffer, Title, MB_OK | MB_ICONINFORMATION);
}

//単精度浮動小数表示用
void CDEBUG::Print(float Arg, WCHAR* Title = L"Debug float", WCHAR* Format = L"%f") {

	sprintf(m_Buffer, Format, Arg);
	MessageBoxW(m_hWnd, m_Buffer, Title, MB_OK | MB_ICONINFORMATION);
}

//倍精度浮動小数表示用
void CDEBUG::Print(double Arg, WCHAR* Title = L"Debug double", WCHAR* Format = L"%lf") {

	sprintf(m_Buffer, Format, Arg);
	MessageBoxW(m_hWnd, m_Buffer, Title, MB_OK | MB_ICONINFORMATION);
}

// ErrorMsg (Error Message) 関数
void CDEBUG::ErrorMsg() {
	
	DWORD err_code = GetLastError();
	DWORD   dwFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER	//メッセージ用のメモリ要求
					| FORMAT_MESSAGE_FROM_SYSTEM		//Windowsのエラーメッセージを検索
					| FORMAT_MESSAGE_IGNORE_INSERTS;	//メッセージの挿入、最後引数を無視
	LPVOID lpMsg;										//メッセージ用テキストバッファポインタ
	FormatMessageW(dwFlags,								//フォーマットオプション
		NULL, err_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),	//無視、エラーコード、言語指定
		(LPTSTR)&lpMsg, 0, NULL);						//バッファへポインタ、不要、無視（挿入数値）		
	MessageBoxW(m_hWnd, (LPWSTR)lpMsg, L"エラー", MB_OK | MB_ICONEXCLAMATION);
	LocalFree(lpMsg);									//メッセージテキスト用メモリーの解放
}
