//////////////////////////////////////////
// DumpProc.h
// Copyright (c) 03/04/2021 by BCCSkelton
//////////////////////////////////////////
#define		EDITMAX	32767
/////////////////////////////////
//主ウィンドウCMyWndの関数の定義
//ウィンドウメッセージ関数
/////////////////////////////////
bool CMyWnd::OnInit(WPARAM wParam, LPARAM lParam) {

	//コモンコントロールの初期化
	InitCommonControls();

	//ステータスバー登録−SetHandle(hWnd))
	SBar.SetHandle(GetDlgItem(m_hWnd, IDC_STATUSBAR));
	//ステータスバー区画設定
	int sec[1] = {-1};
	SBar.SetSection(1, sec);
	//ステータスバー文字列設定
	SBar.SetText(0, "ファイル名−「ファイル」ボタンで選択");

	//☆ドラッグアンドドロップの受付開始
	DragAcceptFiles(m_hWnd, TRUE);

	//ファイルドロップによる起動
	if(g_ByFile)
		OnFile();

	return TRUE;
}

bool CMyWnd::OnSize(WPARAM wParam, LPARAM lParam) {

	SBar.AutoSize();
	return TRUE;
}

bool CMyWnd::OnClose(WPARAM wParam, LPARAM lParam) {

	if(MessageBox(m_hWnd, "終了しますか", "終了確認",
					MB_YESNO | MB_ICONINFORMATION) == IDYES)
		//処理をするとDestroyWindow、PostQuitMessageが呼ばれる
		return TRUE;
	else
		//そうでなければウィンドウではDefWindowProc関数をreturn、ダイアログではreturn FALSEとなる。
		return FALSE;
}

//ダイアログベースの場合はこれが必要
bool CMyWnd::OnDestroy(WPARAM wPram, LPARAM lParam) {

	PostQuitMessage(0);
	return TRUE;
}

bool CMyWnd::OnDropFiles(WPARAM wParam, LPARAM lParam) {

	//典型的なドラッグアンドドロップ処理
	static char lpszFn[MAX_PATH];
	HDROP hDrop = (HDROP)wParam; 					//HDROPを取得
	DragQueryFile(hDrop, 0, lpszFn, MAX_PATH);		//ファイル名を取得
	g_FileName = lpszFn;
	g_ByFile = TRUE;
	OnFile();
	DragFinish(hDrop);								//終了処理
	return TRUE;
}

/////////////////////////////////
//主ウィンドウCMyWndの関数の定義
//メニュー項目、コントロール関数
/////////////////////////////////
bool CMyWnd::OnIdok() {

	SendMsg(WM_CLOSE, 0, 0);
	return TRUE;
}

bool CMyWnd::OnFile() {

	//ファイル選択（ドラッグアンドドロップでは省略）
	if(g_ByFile)
		g_ByFile = FALSE;
	else
		g_FileName = cmndlg.GetFileName(m_hWnd, "すべてのファイル(*.*)\0*.*\0\0", TRUE);
	if(!g_FileName) {
		MessageBox(m_hWnd, "ファイル選択がキャンセルされました", "キャンセル", MB_OK | MB_ICONSTOP);
		return FALSE;
	}
	//ステータスバーにファイル名表示
	SBar.SetText(0, g_FileName);
	SBar.SendMsg(SB_SETTIPTEXT, 0, (LPARAM)g_FileName);	//ToolTipをつける
	//ダンプ表示処理
	CFILE File;					//ファイルクラスオブジェクト
	File.LoadFile(g_FileName);	//ファイルを読み込む
	int Max = File.m_FileSize;	//文字数Max
	File.GoTop();				//ファイルの先頭へ
	char str[MAX_PATH];			//一行書き込み文字列バッファ
	CSTR Buff;					//エディットコントロール書き込み文字列バッファ
	int page, count = 0;
	do {
		Buff = "";				//初期化
		(Max > EDITMAX) ? page = EDITMAX : page = Max;
		for(int i = 0; i < page; i += 16) {
			int n = 0, j = 0;
			n = wsprintf(str, "%04X ", count * EDITMAX + i);	//アドレス
			j += n;
			for(int k = 0; k < 8; k++) {						//8バイト16進書き込み
				n = wsprintf(str + j, "%02X ", File.m_Ptr[count * EDITMAX + i + k] & 0xFF);
				j += n;
			}
			n = wsprintf(str + j, ":");							//セパレーター
			j += n;
			for(int k = 8; k < 16; k++) {						//8バイト16進書き込み
				n = wsprintf(str + j, "%02X ", File.m_Ptr[count * EDITMAX + i + k] & 0xFF);
				j += n;
			}
			n = wsprintf(str + j, ":");							//セパレーター
			j += n;
			for(int k = 0; k < 16; k++) {						//キャラクター表示
				n = wsprintf(str + j, "%c", isalnum(File.m_Ptr[count * EDITMAX + i + k]) ? File.m_Ptr[count * EDITMAX + i + k] : '.');
				j += n;
			}
			n = wsprintf(str + j, "\r\n");
			Buff = Buff + str;
		}
		SendItemMsg(IDC_EDIT, WM_SETTEXT, 0, (LPARAM)Buff.ToChar());
		if((Max -= EDITMAX) > 0) {
			count++;
			//以下のメッセージボックスはメインダイアログを操作できるように兄弟（親はデスクトップ）にしている
			if(MessageBox(NULL, "データがまだあります。続けますか？", "確認", MB_YESNO | MB_ICONQUESTION) == IDNO)
				break;
		}
	} while(Max > 0);

	return TRUE;
}
