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

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

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

//整数表示用
void CDEBUG::Print(int Arg, char* Title = "Debug int", char* Format = "%d") {
	wsprintfA(m_Buffer, Format, Arg);
	MessageBoxA(m_hWnd, m_Buffer, Title, MB_OK | MB_ICONINFORMATION);
}

//長整数表示用
void CDEBUG::Print(long int Arg, char* Title = "Debug long int", char* Format = "%ld") {
	wsprintfA(m_Buffer, Format, Arg);
	MessageBoxA(m_hWnd, m_Buffer, Title, MB_OK | MB_ICONINFORMATION);
}

//符号なし整数表示用
void CDEBUG::Print(WORD Arg, char* Title = "Debug WORD", char* Format = "%d") {
	wsprintfA(m_Buffer, Format, Arg);
	MessageBoxA(m_hWnd, m_Buffer, Title, MB_OK | MB_ICONINFORMATION);
}

//符号なし長整数表示用
void CDEBUG::Print(DWORD Arg, char* Title = "Debug DWORD", char* Format = "%ld") {
	wsprintfA(m_Buffer, Format, Arg);
	MessageBoxA(m_hWnd, m_Buffer, Title, MB_OK | MB_ICONINFORMATION);
}

//単精度浮動小数表示用
void CDEBUG::Print(float Arg, char* Title = "Debug float", char* Format = "%f") {
	sprintfA(m_Buffer, Format, Arg);
	MessageBoxA(m_hWnd, m_Buffer, Title, MB_OK | MB_ICONINFORMATION);
}

//倍精度浮動小数表示用
void CDEBUG::Print(double Arg, char* Title = "Debug double", char* Format = "%lf") {
	sprintfA(m_Buffer, Format, Arg);
	MessageBoxA(m_hWnd, m_Buffer, Title, MB_OK | MB_ICONINFORMATION);
}

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