//////////////////////////////////////////
// BMPViewerProc.h
// Copyright (c) 09/08/2002 by BCCSkelton
//////////////////////////////////////////

/////////////////////////////////
//主ウィンドウCMyWndの関数の定義
//ウィンドウメッセージ関数
/////////////////////////////////
bool CMyWnd::OnCreate(WPARAM wParam, LPARAM lParam) {

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

	//ツールバー登録−Init(hWnd, hIinstance, ID, (以下省略可）Style)
	TBar.Init(m_hWnd, m_hInstance, TOOLBAR);
	//ツールバーボタン用ビットマップ追加
	TBar.AddBmp(TRUE);
	//ツールバーボタン追加
	TBBUTTON tbb[7];
	ZeroMemory(tbb, sizeof(tbb));
	tbb[0].iBitmap = STD_FILEOPEN;
	tbb[0].fsState = TBSTATE_ENABLED;
	tbb[0].fsStyle = TBSTYLE_BUTTON;
	tbb[0].idCommand = IDM_OPEN;
	tbb[1].iBitmap = STD_FILESAVE;
	tbb[1].fsStyle = TBSTYLE_BUTTON;
	tbb[1].idCommand = IDM_SAVE;
	tbb[2].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[3].iBitmap = STD_FIND;
	tbb[3].fsStyle = TBSTYLE_BUTTON;
	tbb[3].idCommand = IDM_INFO;
	tbb[4].iBitmap = STD_PROPERTIES;
	tbb[4].fsStyle = TBSTYLE_BUTTON;
	tbb[4].idCommand = IDM_DUMP;
	tbb[5].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[6].iBitmap = STD_HELP;
	tbb[6].fsState = TBSTATE_ENABLED;
	tbb[6].fsStyle = TBSTYLE_BUTTON;
	tbb[6].idCommand = IDM_VERSION;
	TBar.AddButtons(7, tbb);

	//ステータスバー登録−Init(hWnd, hIinstance, ID, (以下省略可）Style)
	SBar.Init(m_hWnd, m_hInstance, STATUSBAR);
	//ステータスバー区画設定
	int sec[2] = {400, -1};
	SBar.SetSection(2, sec);
	//ステータスバー文字列設定
	SBar.SetText(0, "");
	SBar.SetText(1, "BitmapViewer Ver 1.0 Copyright 2002 by ysama");

	//仮想ウィンドウの初期化
	cvs.SetCanvas(m_hWnd);

	//☆ドラッグアンドドロップの受付開始
	DragAcceptFiles(m_hWnd, TRUE);
	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;
	SendMessage(m_hWnd, WM_COMMAND, IDM_OPEN, -1);
	DragFinish(hDrop);								//終了処理
	return TRUE;
}

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

	TBar.AutoSize();
	SBar.AutoSize();
	return TRUE;
}

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

	PAINTSTRUCT paint;
	cvs.OnPaint(BeginPaint(m_hWnd, &paint));
	EndPaint(m_hWnd, &paint);
	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;
}

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

	if(lParam != -1)
		g_FileName = cmndlg.GetFileName(m_hWnd, "ビットマップファイル(*.bmp)\0*.bmp\0\0", TRUE);
	if(g_FileName) {
		cvs.BrSelection(4);
		cvs.Clear();
		if(g_Bmp.LoadBMP(m_hWnd, g_FileName, TRUE)) {
			EnableMenuItem(GetSubMenu(GetMenu(BMPViewer.m_hWnd), 0), 1, MF_BYPOSITION | MF_ENABLED);
			EnableMenuItem(GetSubMenu(GetMenu(BMPViewer.m_hWnd), 0), 2, MF_BYPOSITION | MF_ENABLED);
			EnableMenuItem(GetMenu(BMPViewer.m_hWnd), 1, MF_BYPOSITION | MF_ENABLED);
			DrawMenuBar(BMPViewer.m_hWnd);
			SendMessage(TBar.m_hWnd, TB_ENABLEBUTTON, IDM_SAVE, MAKELONG(TRUE, 0));
			SendMessage(TBar.m_hWnd, TB_ENABLEBUTTON, IDM_INFO, MAKELONG(TRUE, 0));
			SendMessage(TBar.m_hWnd, TB_ENABLEBUTTON, IDM_DUMP, MAKELONG(TRUE, 0));
			RECT rec;
			GetWindowRect(TBar.m_hWnd, &rec);
			g_Bmp.PutBMP(m_hWnd, cvs.hDC(), 0, rec.bottom - rec.top);
			InvalidateRect(m_hWnd, NULL, TRUE);
		}
		else {
			EnableMenuItem(GetSubMenu(GetMenu(BMPViewer.m_hWnd), 0), 1, MF_BYPOSITION | MF_DISABLED);
			EnableMenuItem(GetSubMenu(GetMenu(BMPViewer.m_hWnd), 0), 2, MF_BYPOSITION | MF_DISABLED);
			EnableMenuItem(GetMenu(BMPViewer.m_hWnd), 1, MF_BYPOSITION | MF_DISABLED);
			DrawMenuBar(BMPViewer.m_hWnd);
			SendMessage(TBar.m_hWnd, TB_ENABLEBUTTON, IDM_SAVE, MAKELONG(FALSE, 0));
			SendMessage(TBar.m_hWnd, TB_ENABLEBUTTON, IDM_INFO, MAKELONG(FALSE, 0));
			SendMessage(TBar.m_hWnd, TB_ENABLEBUTTON, IDM_DUMP, MAKELONG(FALSE, 0));
		}
	}
	else {
		MessageBox(m_hWnd, "操作はキャンセルされました", "メッセージ", MB_OK | MB_ICONSTOP);
	}
	SBar.SetText(0, g_FileName);
	return TRUE;
}

bool CMyWnd::OnSave() {

	if(!g_FileName)
		SendMessage(m_hWnd, WM_COMMAND, IDM_SAVEAS, 0);
	else
		g_Bmp.SaveBMP(g_FileName);	//☆オリジナルのカラービットでセーブ
	return TRUE;
}

bool CMyWnd::OnSaveas() {

	g_FileName = cmndlg.GetFileName(m_hWnd, "ビットマップファイル(*.bmp)\0*.bmp\0\0", FALSE);
	if(g_FileName) {
		int i = selectclrdlg.DoModal(m_hWnd, "IDD_SELECTCLR", selectclrdlgProc);
		SBar.SetText(0, g_FileName);
		g_Bmp.SaveBMP(g_FileName, i);	//☆カラービットを指定してセーブ
	}
	return TRUE;
}

bool CMyWnd::OnExit() {

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

bool CMyWnd::OnInfo() {

	g_Flag = TRUE;
	bmpinfodlg.DoModal(m_hWnd, "IDD_BMPINFO", bmpinfodlgProc);
	return TRUE;
}

bool CMyWnd::OnDump() {

	dumpdlg.DoModal(m_hWnd, "IDD_DUMP", dumpdlgProc);
	return TRUE;
}

bool CMyWnd::OnHelp() {

	helpdlg.DoModal(m_hWnd, "IDD_HELP", helpdlgProc);
	return TRUE;
}
bool CMyWnd::OnVersion() {

	helpdlg.DoModal(m_hWnd, "IDD_VERSION", versiondlgProc);
	return TRUE;
}

///////////////////////////////
//ユーザーダイアログの関数定義
//コントロール関数
///////////////////////////////
bool SELECTCLRDLG::OnInit(WPARAM wParam, LPARAM lParam) {

	//カラービットによりラジオボックスの初期状態を決定
	switch(g_Bmp.CBits()) {
		case 1:		selectclrdlg.SendItemMsg(IDC_RADIOBOX01, BM_SETCHECK,
												BST_CHECKED, 0); break;
		case 4:		selectclrdlg.SendItemMsg(IDC_RADIOBOX04, BM_SETCHECK,
												BST_CHECKED, 0); break;
		case 8:		selectclrdlg.SendItemMsg(IDC_RADIOBOX08, BM_SETCHECK,
												BST_CHECKED, 0); break;
		case 16:	selectclrdlg.SendItemMsg(IDC_RADIOBOX16, BM_SETCHECK,
												BST_CHECKED, 0); break;
		case 24:	selectclrdlg.SendItemMsg(IDC_RADIOBOX24, BM_SETCHECK,
												BST_CHECKED, 0); break;
		case 32:	selectclrdlg.SendItemMsg(IDC_RADIOBOX32, BM_SETCHECK,
												BST_CHECKED, 0); break;
	}
	return TRUE;
}

bool SELECTCLRDLG::OnIdok() {

	//選択ラジオボックスによって返り値を決定
	int ret = 0;
	if(selectclrdlg.SendItemMsg(IDC_RADIOBOX01, BM_GETCHECK, 0, 0)
								== BST_CHECKED)
		ret = 1;
	else if(selectclrdlg.SendItemMsg(IDC_RADIOBOX04, BM_GETCHECK, 0, 0)
								== BST_CHECKED)
		ret = 4;
	else if(selectclrdlg.SendItemMsg(IDC_RADIOBOX08, BM_GETCHECK, 0, 0)
								== BST_CHECKED)
		ret = 8;
	else if(selectclrdlg.SendItemMsg(IDC_RADIOBOX16, BM_GETCHECK, 0, 0)
								== BST_CHECKED)
		ret = 16;
	else if(selectclrdlg.SendItemMsg(IDC_RADIOBOX24, BM_GETCHECK, 0, 0)
								== BST_CHECKED)
		ret = 24;
	else if(selectclrdlg.SendItemMsg(IDC_RADIOBOX32, BM_GETCHECK, 0, 0)
								== BST_CHECKED)
		ret = 32;
	EndModal(ret);
	return TRUE;
}

///////////////////////////////
//ユーザーダイアログの関数定義
//メッセージ関数
///////////////////////////////
bool BMPINFODLG::OnInit(WPARAM wParam, LPARAM lParam) {

	//☆ビットマップ情報ダイアログの初期化（User.h参照）
	EnableAllControls(g_Flag);
	return TRUE;
}

///////////////////////////////
//ユーザーダイアログの関数定義
//コントロール関数
///////////////////////////////
bool BMPINFODLG::OnIdhelp() {

	//ヘルプメッセージボックスの表示
	PBITMAPINFOHEADER pbih = (PBITMAPINFOHEADER)g_Bmp.m_PBmi;
	HowtoReadBitmapInfo(g_FileName, pbih->biWidth, pbih->biHeight,
							pbih->biBitCount, pbih->biSizeImage, g_Bmp.m_PBmf->bfOffBits,
							g_Bmp.m_Bmp.bmWidth, g_Bmp.m_Bmp.bmHeight, g_Bmp.m_Bmp.bmBitsPixel);
	return TRUE;
}

bool BMPINFODLG::OnIdok() {

	EndModal(TRUE);
	return TRUE;
}

///////////////////////////////
//ユーザーダイアログの関数定義
//コントロール関数
///////////////////////////////
bool DUMPDLG::OnInit(WPARAM wParam, LPARAM lParam) {

	//ダンプ表示処理
	char str[MAX_PATH];			//書き込み文字バッファ
	CSTR Buff;					//書き込み文字列バッファ
	CFILE File;					//☆ファイルクラスオブジェクト
	File.LoadFile(g_FileName);	//☆ファイルを読み込む
	File.GoTop();				//☆ファイルの先頭へ
	int Max = File.m_FileSize > 32768 ? 32768 : File.m_FileSize;	//32K打止
	for(int i = 0; i < Max; i += 16) {
		int n = 0, j = 0;
		n = wsprintf(str, "%04X ", i);	//アドレス
		j += n;
		for(int k = 0; k < 8; k++) {	//8バイト16進書き込み
			n = wsprintf(str + j, "%02X ", File.m_Ptr[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[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[i + k]) ? File.m_Ptr[i + k] : '.');
			j += n;
		}
		n = wsprintf(str + j, "\r\n");
		Buff = Buff + str;
	}
	SendItemMsg(IDC_EDIT, WM_SETTEXT, 0, (LPARAM)Buff.ToChar());
	return TRUE;
}

bool DUMPDLG::OnIdok() {

	EndModal(TRUE);
	return TRUE;
}

///////////////////////////////
//ユーザーダイアログの関数定義
//コントロール関数
///////////////////////////////
bool HELPDLG::OnInit(WPARAM wParam, LPARAM lParam) {

	char HelpFile[MAX_PATH];

	//☆ヘルプファイル名取得
	lstrcpy(HelpFile, GetCommandLine());
	char* cp = strstr(HelpFile, "BMPViewer.exe");
	if(*cp) {	//ひょっとしてエラー回避
		lstrcpy(strstr(HelpFile, "BMPViewer.exe"), "BMPreadme.txt");
		if(*HelpFile == '\"')
			lstrcpy(HelpFile, HelpFile + 1);
	}
	//☆エディットコントロールにreadme.txtファイルを読ませる
	CFILE File;
	File.LoadFile(HelpFile);
	SendItemMsg(IDC_EDIT, WM_SETTEXT, 0, (LPARAM)File.Read());
	return TRUE;
}

bool HELPDLG::OnIdok() {

	EndModal(TRUE);
	return TRUE;
}

///////////////////////////////
//ユーザーダイアログの関数定義
//コントロール関数
///////////////////////////////
bool VERSIONDLG::OnIdok() {

	EndModal(TRUE);
	return TRUE;
}

