//////////////////////////////////////////
// EZImageProc.h
// Copyright (c) 03/01/2021 by BCCSkelton
//////////////////////////////////////////
#define	MIN_W	600
#define	MIN_H	400
#define swap(a,b) (a ^= b,b = a ^ b,a ^= b)

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

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

	//ツールバー登録−Init(hWnd, hIinstance, ID, (以下省略可）Style)
	TBar.Init(m_hWnd, m_hInstance, TOOLBAR);
	//ツールバーボタン用カスタムビットマップ追加
	TBar.AddBmp(m_hInstance, MAKEINTRESOURCE(IDI_TBAR), 25);
	//ツールバーボタン追加
	TBBUTTON tbb[32];
	ZeroMemory(tbb, sizeof(tbb));
	tbb[0].iBitmap = TBar.m_id + 0;
	tbb[0].fsState = TBSTATE_ENABLED;
	tbb[0].fsStyle = TBSTYLE_BUTTON;
	tbb[0].idCommand = IDM_NEW;
	tbb[1].iBitmap = TBar.m_id + 1;
	tbb[1].fsState = TBSTATE_ENABLED;
	tbb[1].fsStyle = TBSTYLE_BUTTON;
	tbb[1].idCommand = IDM_OPEN;
	tbb[2].iBitmap = TBar.m_id + 2;
	tbb[2].fsState = TBSTATE_ENABLED;
	tbb[2].fsStyle = TBSTYLE_BUTTON;
	tbb[2].idCommand = IDM_SAVE;
	tbb[3].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[4].iBitmap = TBar.m_id + 3;
	tbb[4].fsState = TBSTATE_ENABLED;
	tbb[4].fsStyle = TBSTYLE_BUTTON;
	tbb[4].idCommand = IDM_EXIT;
	tbb[5].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[6].iBitmap = TBar.m_id + 4;
	tbb[6].fsStyle = TBSTYLE_BUTTON;
	tbb[6].idCommand = IDM_UNDO;
	tbb[7].iBitmap = TBar.m_id + 5;
	tbb[7].fsState = TBSTATE_ENABLED;
	tbb[7].fsStyle = TBSTYLE_BUTTON;
	tbb[7].idCommand = IDM_COPY;
	tbb[8].iBitmap = TBar.m_id + 6;
	tbb[8].fsStyle = TBSTYLE_BUTTON;
	tbb[8].idCommand = IDM_PASTE;
	tbb[9].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[10].iBitmap = TBar.m_id + 7;
	tbb[10].fsState = TBSTATE_CHECKED;
	tbb[10].fsStyle = TBSTYLE_BUTTON;
	tbb[10].idCommand = IDM_DOT;
	tbb[11].iBitmap = TBar.m_id + 8;
	tbb[11].fsState = TBSTATE_ENABLED;
	tbb[11].fsStyle = TBSTYLE_BUTTON;
	tbb[11].idCommand = IDM_LINE;
	tbb[12].iBitmap = TBar.m_id + 9;
	tbb[12].fsState = TBSTATE_ENABLED;
	tbb[12].fsStyle = TBSTYLE_BUTTON;
	tbb[12].idCommand = IDM_BOX;
	tbb[13].iBitmap = TBar.m_id + 10;
	tbb[13].fsState = TBSTATE_ENABLED;
	tbb[13].fsStyle = TBSTYLE_BUTTON;
	tbb[13].idCommand = IDM_ELLIPSE;
	tbb[14].iBitmap = TBar.m_id + 11;
	tbb[14].fsState = TBSTATE_ENABLED;
	tbb[14].fsStyle = TBSTYLE_BUTTON;
	tbb[14].idCommand = IDM_BOXF;
	tbb[15].iBitmap = TBar.m_id + 12;
	tbb[15].fsState = TBSTATE_ENABLED;
	tbb[15].fsStyle = TBSTYLE_BUTTON;
	tbb[15].idCommand = IDM_ELLIPSEF;
	tbb[16].iBitmap = TBar.m_id + 13;
	tbb[16].fsState = TBSTATE_ENABLED;
	tbb[16].fsStyle = TBSTYLE_BUTTON;
	tbb[16].idCommand = IDM_PAINT;
	tbb[17].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[18].iBitmap = TBar.m_id + 14;
	tbb[18].fsState = TBSTATE_ENABLED;
	tbb[18].fsStyle = TBSTYLE_BUTTON;
	tbb[18].idCommand = IDM_COLDLG;
	tbb[19].iBitmap = TBar.m_id + 15;
	tbb[19].fsState = TBSTATE_ENABLED;
	tbb[19].fsStyle = TBSTYLE_BUTTON;
	tbb[19].idCommand = IDM_GETCOL;
	tbb[20].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[21].iBitmap = TBar.m_id + 16;
	tbb[21].fsState = TBSTATE_ENABLED;
	tbb[21].fsStyle = TBSTYLE_BUTTON;
	tbb[21].idCommand = IDM_SHIFTR;
	tbb[22].iBitmap = TBar.m_id + 17;
	tbb[22].fsState = TBSTATE_ENABLED;
	tbb[22].fsStyle = TBSTYLE_BUTTON;
	tbb[22].idCommand = IDM_SHIFTL;
	tbb[23].iBitmap = TBar.m_id + 18;
	tbb[23].fsState = TBSTATE_ENABLED;
	tbb[23].fsStyle = TBSTYLE_BUTTON;
	tbb[23].idCommand = IDM_SHIFTU;
	tbb[24].iBitmap = TBar.m_id + 19;
	tbb[24].fsState = TBSTATE_ENABLED;
	tbb[24].fsStyle = TBSTYLE_BUTTON;
	tbb[24].idCommand = IDM_SHIFTD;
	tbb[25].iBitmap = TBar.m_id + 20;
	tbb[25].fsState = TBSTATE_ENABLED;
	tbb[25].fsStyle = TBSTYLE_BUTTON;
	tbb[25].idCommand = IDM_LANDR;
	tbb[26].iBitmap = TBar.m_id + 21;
	tbb[26].fsState = TBSTATE_ENABLED;
	tbb[26].fsStyle = TBSTYLE_BUTTON;
	tbb[26].idCommand = IDM_UANDD;
	tbb[27].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[28].iBitmap = TBar.m_id + 22;
	tbb[28].fsState = TBSTATE_ENABLED;
	tbb[28].fsStyle = TBSTYLE_BUTTON;
	tbb[28].idCommand = IDM_DISPLAY;
	tbb[29].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[30].iBitmap = TBar.m_id + 23;
	tbb[30].fsState = TBSTATE_ENABLED;
	tbb[30].fsStyle = TBSTYLE_BUTTON;
	tbb[30].idCommand = IDM_HELP;
	tbb[31].iBitmap = TBar.m_id + 24;
	tbb[31].fsState = TBSTATE_ENABLED;
	tbb[31].fsStyle = TBSTYLE_BUTTON;
	tbb[31].idCommand = IDM_VERSION;
	TBar.AddButtons(32, tbb);

	//ステータスバー登録−Init(hWnd, hIinstance, ID, (以下省略可）Style)
	SBar.Init(m_hWnd, m_hInstance, STATUSBAR);
	//ステータスバー区画設定
	int sec[3] = {100, 200, -1};
	SBar.SetSection(3, sec);
	//ステータスバー文字列設定
	SBar.SetText(0, "EZImage Ver 2.0");
	SBar.SetText(2, "新規ファイル");

	//メンバー変数初期化
	m_hDC = GetDC(m_hWnd);	//CMyWndのデバイスコンテキスト取得

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

	//CBMPEXインスタンスの初期化
	g_Bmp.SetWnd(m_hWnd);

	//ドラッグアンドドロップを開始する
	DragAcceptFiles(m_hWnd, TRUE);

	//マウス右ボタンポップアップメニューハンドルの取得
	g_hPopup = GetSubMenu(GetMenu(m_hWnd), 1);

	//EZImage.exeのフォールダーとヘルプファイルを記録
	lstrcpy(g_HelpFile, "hh \"");
	lstrcat(g_HelpFile, arg.Path());
	lstrcat(g_HelpFile, "\\EZImageHelp.chm\"");

	//CHISTORY変数のiniファイル設定
	lstrcpy(g_IniFile, arg.Path());
	lstrcat(g_IniFile, "\\EZImage.ini");
	history.SetPath(g_IniFile);
	history.SetMenu(GetSubMenu(GetSubMenu(GetMenu(m_hWnd), 0), 5));
	history.Init();

	//外部変数の初期化
	lstrcpy(g_FileName, "新規ファイル");
	SetFileName(g_UndoPtr, g_FileName);	//ファイル名履歴管理開始
	g_hSpoit = (HICON)LoadImage(m_hInstance, MAKEINTRESOURCE(IDI_SPOIT), IMAGE_CURSOR, 0, 0, LR_DEFAULTCOLOR);

	return TRUE;
}

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

	//x、y変数設定
	DWORD x = LOWORD(lParam);
	DWORD y = HIWORD(lParam);

	//色の採取モードであれば色をとり、表示して終了
	if(g_GetCol) {
		//選択色を保存
		COLORREF New_Color = cvs.m_Color = GetPixel(m_hDC, x, y);
		//選択色を矩形で表示
		cvs.Box(g_CpX, g_CpY + g_DUnit * 3, g_CpX + g_DUnit, g_CpY + g_DUnit * 4, 1);
		//黒色で枠線を描く
		cvs.Color(0);
		cvs.Box(g_CpX, g_CpY + g_DUnit * 3, g_CpX + g_DUnit, g_CpY + g_DUnit * 4, 0);
		//保存していた選択色に復帰
		cvs.m_Color = New_Color;
		return TRUE;
	}

	//拡大描画領域内−描画処理開始
	if(x >= g_DrawX && x < (g_DrawX + g_DrawW) && y >= g_DrawY && y < (g_DrawY + g_DrawH)) {
		//BMP領域のUndo取り込みとUndoメニュー、ボタンの有効化
		if(g_Cmd != IDM_COPY)
			RecordUndo();
		//Bitmap領域の描画開始位置始
		g_sx = g_BmpX + (x - g_DrawX) / g_DUnit;
		g_sy = g_BmpY + (y - g_DrawY) / g_DUnit;
		//拡大表示領域の描画開始位置と破線矩形描画
		g_Drag.x = (x - g_DrawX) / g_DUnit * g_DUnit + g_DrawX + g_DUnit / 2;
		g_Drag.y = (y - g_DrawY) / g_DUnit * g_DUnit + g_DrawY + g_DUnit / 2;
		//カーソルを十字形状のものに変更
		SetCursor(LoadCursor(NULL, IDC_CROSS));
		//破線矩形描画開始
		cvs.DragRect(g_Drag.x, g_Drag.y, TRUE);
		g_On = TRUE;						//描画モード開始
	}
	//カラーパレット内−採色処理開始
	else if(x >= g_CpX && x < (g_CpX + g_DUnit * 8) && y >= g_CpY && y < (g_CpY + g_DUnit * 2)) {
		int Col = (x - g_CpX) / g_DUnit + ((y - g_CpY) / g_DUnit) * 8;
		cvs.Color(Col);		//選択色で矩形を描く
		cvs.Box(g_CpX, g_CpY + g_DUnit * 3, g_CpX + g_DUnit, g_CpY + g_DUnit * 4, 1);
		cvs.Color(0);		//黒色で枠線を描く
		cvs.Box(g_CpX, g_CpY + g_DUnit * 3, g_CpX + g_DUnit, g_CpY + g_DUnit * 4, 0);
		cvs.Color(Col);		//選択色に戻す
	}

	return TRUE;
}

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

	//x、y変数設定
	DWORD x = LOWORD(lParam);
	DWORD y = HIWORD(lParam);

	//色採取モードの場合
	if(g_GetCol)
		SetCursor(g_hSpoit);	//スポイト形状のカーソルに交換

	//描画領域内
	char cordinate[16] = {0};
	if(x >= g_DrawX && x < g_DrawX + g_DrawW && y >= g_DrawY && y < g_DrawY + g_DrawH) {
		//描画領域内のマウス位置をステータスバーに表示
		wsprintf(cordinate, "x : y = %2d : %2d", (x - g_DrawX) / g_DUnit, (y - g_DrawY) / g_DUnit);
		//描画中の場合
		if(g_On) {
			//カーソル形状は十字のまま
			SetCursor(LoadCursor(NULL, IDC_CROSS));
			//破線矩形の描画継続
			g_Drag.x = (x - g_DrawX) / g_DUnit * g_DUnit + g_DrawX + g_DUnit / 2;
			g_Drag.y = (y - g_DrawY) / g_DUnit * g_DUnit + g_DrawY + g_DUnit / 2;
			cvs.DragRect(g_Drag.x, g_Drag.y, TRUE);	//描画した点線矩形を消す
		}
	}
 	//2つ目の枠に座標を設定（領域外の場合はブランク
	SendMessage(SBar.GetHandle(), SB_SETTEXT, 1, (LPARAM)cordinate);

	return TRUE;
}

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

	//x、y変数設定
	DWORD x = LOWORD(lParam);
	DWORD y = HIWORD(lParam);

	//色採取モードの場合−採色処理終了
	if(g_GetCol) {
		//カーソルを元に戻す
		SetCursor(LoadCursor(NULL, IDC_ARROW));
		//凍結していたメニュー、ツールバーボタン元にを戻す
		EnableMenuItem(GetMenu(m_hWnd), 1, MF_BYPOSITION | MF_ENABLED);
		ChangeTBState(TRUE);
		ChangeCmdCheck(m_hWnd, g_Cmd);
		g_GetCol = FALSE;
		return TRUE;
	}

	//拡大描画領域内の場合−描画処理終了
	if(x >= g_DrawX && x < (g_DrawX + g_DrawW) && y >= g_DrawY && y < (g_DrawY + g_DrawH)) {
		cvs.DragRect(g_Drag.x, g_Drag.y, FALSE);	//破線矩形描画終了
		g_On = FALSE;								//描画モード終了
		SetCursor(LoadCursor(NULL, IDC_ARROW));		//カーソルを元に戻す
		//Bitmap領域の描画終了位置
		g_ex = g_BmpX + (x - g_DrawX) / g_DUnit;
		g_ey = g_BmpY + (y - g_DrawY) / g_DUnit;
		//Win32の描画では右端、下端が描画されない為、調整
		if(g_sx < g_ex) {			//開始x座標＜終了x座標
			if(g_sy < g_ey) {			//且つ開始y座標＜終了y座標
				g_ex++;
				g_ey++;
			}
			else if(g_sy == g_ey)		//且つ開始y座標＝終了y座標
				g_ex++;
			else {						//且つ開始y座標＞終了y座標
				g_ex++;
				if(g_Cmd == IDM_LINE)
					g_ey--;
				else
					if(g_Cmd != IDM_DOT)
						g_sy++;
			}
		}
		else if(g_sx == g_ex) {		//開始x座標＝終了x座標
			if(g_sy < g_ey)				//且つ開始y座標＜終了y座標
				g_ey++;
			else if(g_sy == g_ey);		//且つ開始y座標＝終了y座標
			else						//且つ開始y座標＞終了y座標
				g_ey--;
		}
		else {						//開始x座標＞終了x座標
			if(g_sy < g_ey) {			//且つ開始y座標＜終了y座標
				if(g_Cmd == IDM_LINE)
					g_ex--;
				else
					if(g_Cmd != IDM_DOT)
						g_sx++;
				g_ey++;
			}
			else if(g_sy == g_ey)		//且つ開始y座標＝終了y座標
				g_ex--;
			else 						//且つ開始y座標＞終了y座標
				if(g_Cmd == IDM_LINE) {
					g_ex--;
					g_ey--;
				}
				else {
					if(g_Cmd != IDM_DOT) {
						g_sx++;
						g_sy++;
					}
				}
		}
		switch(g_Cmd) {
			case IDM_COPY:					//破線部分のBitmapを取得
				if(g_CopPas.Handle()) {	//一度以上取得する場合確認を入れる
					if(MessageBox(m_hWnd, "コピーバッファに前のデータがあります。破棄してコピーしますか？", "確認", MB_YESNO | MB_ICONQUESTION) == IDNO)
						return FALSE;
				}
				//破線矩形の幅と高さ
				g_Drag.x = (x - g_DrawX) / g_DUnit - g_sx + g_BmpX + 1;
				g_Drag.y = (y - g_DrawY) / g_DUnit - g_sy + g_BmpY + 1;
				//破線矩形内のイメージ取得
				g_CopPas.GetBMP(m_hWnd, cvs.hDC(), g_sx, g_sy, g_Drag.x, g_Drag.y);
				//凍結メニューとボタンの復活
				ChangeTBState(TRUE);
				SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_COPY, (LPARAM)TBSTATE_ENABLED);
				EnableMenuItem(GetSubMenu(GetMenu(m_hWnd), 1), 4, MF_BYPOSITION | MF_ENABLED);
				EnableMenuItem(GetSubMenu(GetMenu(m_hWnd), 1), 5, MF_BYPOSITION | MF_ENABLED);
				EnableMenuItem(GetSubMenu(GetMenu(m_hWnd), 1), 6, MF_BYPOSITION | MF_ENABLED);
				EnableMenuItem(GetSubMenu(GetMenu(m_hWnd), 1), 7, MF_BYPOSITION | MF_ENABLED);
				//ペーストメニューとボタンの有効化
				EnableMenuItem(GetSubMenu(GetMenu(m_hWnd), 1), IDM_PASTE, MF_BYCOMMAND | MF_ENABLED);
				SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_PASTE, (LPARAM)TBSTATE_ENABLED);
				ChangeCmdCheck(m_hWnd, g_OldCmd);
				return TRUE;
			case IDM_PASTE:					//取得したBitmapの貼り付け
				char msg[256];
				wsprintf(msg, "コピーバッファのデータを座標（%d, %d）にペーストします。\nよろしいですか？", g_sx - g_BmpX, g_sy - g_BmpY);
				if(MessageBox(m_hWnd, msg, "貼付確認", MB_YESNO | MB_ICONQUESTION) == IDNO)
					return FALSE;
				g_CopPas.PutBMP(m_hWnd, cvs.hDC(), g_sx, g_sy, 0);
				//凍結メニューとボタンの復活
				ChangeTBState(TRUE);
				SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_PASTE, (LPARAM)TBSTATE_ENABLED);
				EnableMenuItem(GetSubMenu(GetMenu(m_hWnd), 1), 4, MF_BYPOSITION | MF_ENABLED);
				EnableMenuItem(GetSubMenu(GetMenu(m_hWnd), 1), 5, MF_BYPOSITION | MF_ENABLED);
				EnableMenuItem(GetSubMenu(GetMenu(m_hWnd), 1), 6, MF_BYPOSITION | MF_ENABLED);
				EnableMenuItem(GetSubMenu(GetMenu(m_hWnd), 1), 7, MF_BYPOSITION | MF_ENABLED);
				ChangeCmdCheck(m_hWnd, g_OldCmd);
				break;
			case IDM_DOT:
				cvs.Dot(g_sx, g_sy);						//点を打つ
				break;
			case IDM_LINE:
				cvs.Line(g_sx, g_sy, g_ex, g_ey);			//線を引く
				break;
			case IDM_BOX:
				cvs.Box(g_sx, g_sy, g_ex, g_ey, 0);			//矩形を描く
				break;
			case IDM_ELLIPSE:
				cvs.Ellipsed(g_sx, g_sy, g_ex, g_ey, 0);	//楕円を描く
				break;
			case IDM_BOXF:
				cvs.Box(g_sx, g_sy, g_ex, g_ey, 1);			//塗りつぶし矩形を描く
				break;
			case IDM_ELLIPSEF:
				cvs.Ellipsed(g_sx, g_sy, g_ex, g_ey, 1);	//塗りつぶし楕円を描く
				break;
			case IDM_PAINT:
				cvs.Paint(g_sx, g_sy, cvs.m_Color);			//塗りつぶす
				break;
		}
		//変更後のビットマップ領域を取り込む
		cvs.GetBMP(g_BmpX, g_BmpY, g_Size, g_Size);
		DrawImage();
	}

	return TRUE;
}

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

	//ウインドウの位置情報を取得
	RECT rec;
	GetWindowRect(m_hWnd, &rec);
	//ポップアップメニューの表示場所を設定
	POINT pt;
	GetCursorPos(&pt);
	//「編集」ポップアップメニューの表示
	TrackPopupMenu(g_hPopup, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_LEFTBUTTON, pt.x, pt.y, 0, m_hWnd, &rec);

	return TRUE;
}

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

	//ツールバーのツールチップ処理
	if(((LPNMHDR)lParam)->code == TTN_NEEDTEXT) {
		switch(((LPTOOLTIPTEXT)lParam)->hdr.idFrom) {
			case IDM_NEW:
				((LPTOOLTIPTEXT)lParam)->lpszText = "新規イメージ";
				break;
			case IDM_OPEN:
				((LPTOOLTIPTEXT)lParam)->lpszText = "イメージを開く";
				break;
			case IDM_SAVE:
				((LPTOOLTIPTEXT)lParam)->lpszText = "イメージの保存";
				break;
			case IDM_EXIT:
				((LPTOOLTIPTEXT)lParam)->lpszText = "EZImageの終了";
				break;
			case IDM_UNDO:
				((LPTOOLTIPTEXT)lParam)->lpszText = "元に戻す";
				break;
			case IDM_COPY:
				((LPTOOLTIPTEXT)lParam)->lpszText = "イメージの一部をコピー";
				break;
			case IDM_PASTE:
				((LPTOOLTIPTEXT)lParam)->lpszText = "イメージの一部を貼り付け";
				break;
			case IDM_DOT:
				((LPTOOLTIPTEXT)lParam)->lpszText = "点";
				break;
			case IDM_LINE:
				((LPTOOLTIPTEXT)lParam)->lpszText = "線";
				break;
			case IDM_BOX:
				((LPTOOLTIPTEXT)lParam)->lpszText = "矩形";
				break;
			case IDM_ELLIPSE:
				((LPTOOLTIPTEXT)lParam)->lpszText = "楕円";
				break;
			case IDM_BOXF:
				((LPTOOLTIPTEXT)lParam)->lpszText = "塗潰矩形";
				break;
			case IDM_ELLIPSEF:
				((LPTOOLTIPTEXT)lParam)->lpszText = "塗潰楕円";
				break;
			case IDM_PAINT:
				((LPTOOLTIPTEXT)lParam)->lpszText = "塗潰し";
				break;
			case IDM_COLDLG:
				((LPTOOLTIPTEXT)lParam)->lpszText = "色選択ダイアログ";
				break;
			case IDM_GETCOL:
				((LPTOOLTIPTEXT)lParam)->lpszText = "色を取得";
				break;
			case IDM_SHIFTR:
				((LPTOOLTIPTEXT)lParam)->lpszText = "右シフト";
				break;
			case IDM_SHIFTL:
				((LPTOOLTIPTEXT)lParam)->lpszText = "左シフト";
				break;
			case IDM_SHIFTU:
				((LPTOOLTIPTEXT)lParam)->lpszText = "上シフト";
				break;
			case IDM_SHIFTD:
				((LPTOOLTIPTEXT)lParam)->lpszText = "下シフト";
				break;
			case IDM_LANDR:
				((LPTOOLTIPTEXT)lParam)->lpszText = "左右反転";
				break;
			case IDM_UANDD:
				((LPTOOLTIPTEXT)lParam)->lpszText = "上下反転";
				break;
			case IDM_DISPLAY:
				((LPTOOLTIPTEXT)lParam)->lpszText = "イメージダイアログの表示";
				break;
			case IDM_HELP:
				((LPTOOLTIPTEXT)lParam)->lpszText = "ヘルプ";
				break;
			case IDM_VERSION:
				((LPTOOLTIPTEXT)lParam)->lpszText = "バージョン情報";
				break;
		}
	}

	return TRUE;
}

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

	//ツールバーとステータスバーの自動調整
	TBar.AutoSize();
	SBar.AutoSize();

	//変数設定
	g_ClientW = LOWORD(lParam);	//幅
	g_ClientH = HIWORD(lParam);	//高さ

	//クライアントエリア内の拡大描画領域を計算する
	RECT rect;
	GetWindowRect(TBar.GetHandle(), &rect);
	//g_DrawX = 0;						//クライアント領域の左（初期設定済）
	g_DrawY = rect.bottom - rect.top;	//ツールバー高さ調整
	g_DrawW = g_ClientW / 2;			//画面（左）半分
	GetWindowRect(SBar.GetHandle(), &rect);
	g_DrawH = g_ClientH - g_DrawY - 	//ツールバーの下から
				rect.bottom + rect.top;	//ステータスバー迄
	if(g_DrawW > g_DrawH)				//いずれか小さい方に合わせる
		g_DrawW = g_DrawH;
	else
		g_DrawH = g_DrawW;
	//イメージサイズに応じた枡目拡大と描画領域の計算（整数調整）
	g_DUnit = g_DrawW / g_Size;
	g_DrawW = g_DrawH = g_DUnit * g_Size;
	//ビットマップ描画領域の計算
	g_BmpX = (((g_ClientW / 2) - g_Size) / 2) + (g_ClientW / 2);	//右側中央
	g_BmpY = g_DrawY + g_ClientH / 4;	//右側の実効高さの上から1/4
	//ウィンドウの描画
	DrawImage();

	//ファイルによって起動された場合
	if(g_ByFile) {
		lstrcpy(g_FileName, arg.v(1));
		OnOpen();
	}

	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) {
		//Undoビットマップの破棄
		for(int i = g_UndoPtr; i > 0; i--) {
			if(g_Undo[i - 1])
				DeleteObject(g_Undo[i - 1]);
		}
		//カーソルを破棄
		DestroyCursor(g_hSpoit);
		//CMyWndのデバイスコンテキスト破棄
		ReleaseDC(m_hWnd, m_hDC);
		//履歴の書き込み
		history.WriteIni();
		//処理をするとDestroyWindow、PostQuitMessageが呼ばれる
    	return TRUE;
	}
	else
		//そうでなければウィンドウではDefWindowProc関数をreturn、ダイアログではreturn FALSEとなる。
		return FALSE;
}

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

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

	return TRUE;
}

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

	//典型的なウィンドウのサイズ制限処理
	MINMAXINFO *pmmi;
	pmmi = (MINMAXINFO*)lParam;
	pmmi->ptMinTrackSize.x = MIN_W;	// 最小幅
	pmmi->ptMinTrackSize.y = MIN_H;	// 最小高

	return FALSE;					//処理はDefWndProcに任す
}

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

	if(MessageBox(m_hWnd, "現在のイメージが破棄されますが、初期化しますか？", "警告", MB_YESNO | MB_ICONQUESTION) == IDNO)
		return FALSE;
	//IDD_NEWダイアログを呼び出しイメージサイズ設定を行う
	newdlg.DoModal(m_hWnd, "IDD_NEW", newdlgProc);
	//16 x 16、32 x 32の変更がある為、再計算の為にWM_SIZEを呼ぶ
	SetSize(m_hWnd);
	//初期色数
	g_BmpCol = 32;
	//ファイル名履歴記録
	lstrcpy(g_FileName, "新規ファイル");
	SetFileName(g_UndoPtr, g_FileName);
	//ステータスバー表示
	SBar.SetText(2, g_FileName);
	SendMessage(SBar.GetHandle(), SB_SETTIPTEXT, 2, (LPARAM)g_FileName);	//ToolTipを付ける

	return TRUE;
}

bool CMyWnd::OnOpen() {

	if(g_ByFile)
		g_ByFile = FALSE;
	else {
		char* cp = cmndlg.GetFileName(m_hWnd, "ビットマップファイル(*.bmp)\0*.bmp\0アイコン、カーソルファイル(*.ico, *.cur)\0*.ico;*.cur\0\0");
		if(cp)
			lstrcpy(g_FileName, cp);	//cpがNULLでなければファイル名をg_FileNameへコピー
		else {
			MessageBox(m_hWnd, "操作はキャンセルされました", "メッセージ", MB_OK | MB_ICONERROR);
			return FALSE;
		}
	}
	//BMP領域のUndo取り込みとUndoメニュー、ボタンの有効化
	RecordUndo();
	//ファイル読込処理
	if(strstr(g_FileName, ".bmp") || strstr(g_FileName, ".BMP")) {		//Bitmapファイル
		g_ImageType = 0;
		if(!g_Bmp.LoadBMP(m_hWnd, g_FileName, TRUE)) {
			MessageBox(m_hWnd, "ビットマップファイルを読み込めませんでした", "エラー", MB_OK | MB_ICONSTOP);
			//Undo処理のキャンセル
			CancelUndo();
			return FALSE;
		}
	}
	else if(strstr(g_FileName, ".ico") || strstr(g_FileName, ".ICO")) {	//Iconファイル
		g_ImageType = 1;
 		int n = iconview_dlg.DoModal(m_hWnd, "IDD_ICONVIEW", iconview_dlgProc);
		if(!g_Bmp.LoadIconFromBMP(g_FileName, IMAGE_ICON, n)) {
			MessageBox(m_hWnd, "アイコンファイルを読み込めませんでした", "エラー", MB_OK | MB_ICONSTOP);
			//Undo処理のキャンセル
			CancelUndo();
			return FALSE;
		}
	}
	else if(strstr(g_FileName, ".cur") || strstr(g_FileName, ".CUR")) {	//Cursorファイル
		g_ImageType = 2;
		int n = iconview_dlg.DoModal(m_hWnd, "IDD_ICONVIEW", iconview_dlgProc);
		if(!g_Bmp.LoadIconFromBMP(g_FileName, IMAGE_CURSOR, n)) {
			MessageBox(m_hWnd, "カーソルファイルを読み込めませんでした", "エラー", MB_OK | MB_ICONSTOP);
			//Undo処理のキャンセル
			CancelUndo();
			return FALSE;
		}
		//カーソルのホットスポットをg_hsx、g_hsyに記録
		g_hsx = g_Bmp.m_Hotspot.x;
		g_hsy = g_Bmp.m_Hotspot.y;
	}
	//ファイル読込履歴記録
	history.AddItem(g_FileName);
	//いずれの場合でもg_Sizeとg_BmpColを取得する。
	g_BmpCol = g_Bmp.CBits();
	g_Size = g_Bmp.Width();
	//新しいサイズで画面更新
	SetSize(m_hWnd);
	//読み込んだイメージをBMP領域に表示する
	g_Bmp.PutBMP(m_hWnd, cvs.hDC(), g_BmpX, g_BmpY, 0);
	//変更後のビットマップ領域を取り込み画面更新
	cvs.GetBMP(g_BmpX, g_BmpY, g_Size, g_Size);
	DrawImage();
	//ファイル名履歴記録
	SetFileName(g_UndoPtr, g_FileName);
	//ステータスバー表示
	SBar.SetText(2, g_FileName);
	SendMessage(SBar.GetHandle(), SB_SETTIPTEXT, 2, (LPARAM)g_FileName);	//ToolTipを付ける

	return TRUE;
}

bool CMyWnd::OnSave() {

	if(!lstrcmp(g_FileName, "新規ファイル")) {
		OnSaveas();
		return TRUE;
	}
	//最新のビットマップへ更新
	g_Bmp.GetBMP(m_hWnd, cvs.hDC(), g_BmpX, g_BmpY, g_Size, g_Size);
	if(strstr(g_FileName, ".bmp") || strstr(g_FileName, ".BMP")) {	//Bitmapファイル
		g_Bmp.SaveBMP(g_FileName, g_BmpCol);
	}
	else if(strstr(g_FileName, ".ico") || strstr(g_FileName, ".ICO")) {	//Iconファイル
		g_Bmp.SaveAsIcon(g_FileName, g_BmpCol, g_ImageType);
	}
	else if(strstr(g_FileName, ".cur") || strstr(g_FileName, ".CUR")) {	//Cursorファイル
		g_Bmp.SaveAsIcon(g_FileName, g_BmpCol, g_ImageType, g_hsx, g_hsy);
	}

	return TRUE;
}

bool CMyWnd::OnSaveas() {

	//最新のビットマップへ更新
	g_Bmp.GetBMP(m_hWnd, cvs.hDC(), g_BmpX, g_BmpY, g_Size, g_Size);
	//SaveDialogによるg_ImageTypeとg_BmpColの選択
	savedlg.DoModal(m_hWnd, "IDD_SAVE", savedlgProc);
	//保存ダイアログの為の拡張子の設定
	char *flt, *ext;
	if(!g_ImageType) {			//ビットマップ
		flt = "ビットマップファイル(*.bmp)\0*.bmp\0\0";
		ext = "bmp";
	}
	else if(g_ImageType == 1) {	//アイコン
		flt = "アイコンファイル(*.ico)\0*.ico\0\0";
		ext = "ico";
	}
	else if(g_ImageType == 2) {	//カーソル
		flt = "カーソルファイル(*.cur)\0*.cur\0\0";
		ext = "cur";
	}
	//保存ダイアログによるファイル名の設定
	char* cp = cmndlg.GetFileName(m_hWnd, flt, FALSE, ext);
	if(cp)
		lstrcpy(g_FileName, cp);	//cpがNULLでなければファイル名をg_FileNameへコピー
	else {
		MessageBox(m_hWnd, "操作はキャンセルされました", "メッセージ", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	//保存処理
	if(!g_ImageType) {			//ビットマップ
		g_Bmp.SaveBMP(g_FileName, g_BmpCol);
	}
	else if(g_ImageType == 1) {	//アイコン
		g_Bmp.SaveAsIcon(g_FileName, g_BmpCol, g_ImageType);
	}
	else if(g_ImageType == 2) {	//カーソル
		//ホットスポットのx座標（g_hsx）、y座標（g_hsy）を入力
		g_Bmp.SaveAsIcon(g_FileName, g_BmpCol, g_ImageType, g_hsx, g_hsy);
	}
	//ステータスバー表示
	SBar.SetText(2, g_FileName);
	SendMessage(SBar.GetHandle(), SB_SETTIPTEXT, 2, (LPARAM)g_FileName);	//ToolTipを付ける

	return TRUE;
}

bool CMyWnd::OnExit() {

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

bool CMyWnd::OnUndo() {

	//ポインターは次のヌルHBITMAP変数を指しているので戻す
	g_UndoPtr--;
	//直前にUndoで保存したビットマップをg_Bmpで読み込む
	g_Bmp.CheckandInit();				//初期化
	g_Bmp.m_hBMP = g_Undo[g_UndoPtr];	//ビットマップハンドルの設定
	g_Bmp.GetDDBInfo();					//表示されたビットマップの情報取得
	g_Size = g_Bmp.Width();				//サイズを記録
	g_BmpCol = g_Bmp.CBits();			//色数を記録
	SetSize(m_hWnd);					//サイズに合わせて再計算
	//クリップボードから読み込んだビットマップの張り付け
	g_Bmp.PutBMP(m_hWnd, cvs.hDC(), g_BmpX, g_BmpY, 0);
	//変更後のビットマップ領域を取り込む
	cvs.GetBMP(g_BmpX, g_BmpY, g_Size, g_Size);
	//イメージ表示更新
	DrawImage();
	//直前のビットマップを破棄して初期化する
	DeleteObject(g_Undo[g_UndoPtr]);
	g_Undo[g_UndoPtr] = 0;
	if(!g_UndoPtr) {	//g_UndoPtrがゼロならUndoメニューとボタンを無効化
		EnableMenuItem(GetSubMenu(GetMenu(m_hWnd), 1), IDM_UNDO, MF_BYCOMMAND | MF_GRAYED);
		SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_UNDO, (LPARAM)TBSTATE_INDETERMINATE);
	}
	if(CheckandGetFileName(g_UndoPtr, g_FileName)) {
		//ステータスバー表示
		SBar.SetText(2, g_FileName);
		SendMessage(SBar.GetHandle(), SB_SETTIPTEXT, 2, (LPARAM)g_FileName);	//ToolTipを付ける
	}

	return TRUE;
}

bool CMyWnd::OnCopy() {

	if(g_Cmd != IDM_COPY) {
		g_OldCmd = g_Cmd;
		g_Cmd = IDM_COPY;
	}
	ChangeTBState(FALSE);
	SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_COPY, (LPARAM)TBSTATE_PRESSED);
	EnableMenuItem(GetSubMenu(GetMenu(m_hWnd), 1), 4, MF_BYPOSITION | MF_GRAYED);
	EnableMenuItem(GetSubMenu(GetMenu(m_hWnd), 1), 5, MF_BYPOSITION | MF_GRAYED);
	EnableMenuItem(GetSubMenu(GetMenu(m_hWnd), 1), 6, MF_BYPOSITION | MF_GRAYED);
	EnableMenuItem(GetSubMenu(GetMenu(m_hWnd), 1), 7, MF_BYPOSITION | MF_GRAYED);

	return TRUE;

}

bool CMyWnd::OnPaste() {

	if(g_Cmd != IDM_PASTE) {
		g_OldCmd = g_Cmd;
		g_Cmd = IDM_PASTE;
	}
	ChangeTBState(FALSE);
	SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_PASTE, (LPARAM)TBSTATE_PRESSED);
	EnableMenuItem(GetSubMenu(GetMenu(m_hWnd), 1), 4, MF_BYPOSITION | MF_GRAYED);
	EnableMenuItem(GetSubMenu(GetMenu(m_hWnd), 1), 5, MF_BYPOSITION | MF_GRAYED);
	EnableMenuItem(GetSubMenu(GetMenu(m_hWnd), 1), 6, MF_BYPOSITION | MF_GRAYED);
	EnableMenuItem(GetSubMenu(GetMenu(m_hWnd), 1), 7, MF_BYPOSITION | MF_GRAYED);

	return TRUE;
}

bool CMyWnd::OnDot() {

	ChangeCmdCheck(m_hWnd, IDM_DOT);
	return TRUE;
}

bool CMyWnd::OnLine() {

	ChangeCmdCheck(m_hWnd, IDM_LINE);
	return TRUE;
}

bool CMyWnd::OnBox() {

	ChangeCmdCheck(m_hWnd, IDM_BOX);
	return TRUE;
}

bool CMyWnd::OnEllipse() {

	ChangeCmdCheck(m_hWnd, IDM_ELLIPSE);
	return TRUE;
}

bool CMyWnd::OnBoxf() {

	ChangeCmdCheck(m_hWnd, IDM_BOXF);
	return TRUE;
}

bool CMyWnd::OnEllipsef() {

	ChangeCmdCheck(m_hWnd, IDM_ELLIPSEF);
	return TRUE;
}

bool CMyWnd::OnPaint() {

	ChangeCmdCheck(m_hWnd, IDM_PAINT);
	return TRUE;
}

bool CMyWnd::OnColdlg() {

	//選択色表示
	COLORREF Col = cvs.m_Color = cmndlg.GetColor(m_hWnd);
	cvs.Box(g_CpX, g_CpY + g_DUnit * 3, g_CpX + g_DUnit, g_CpY + g_DUnit * 4, 1);
	cvs.Color(0);			//黒色で枠線を描く
	cvs.Box(g_CpX, g_CpY + g_DUnit * 3, g_CpX + g_DUnit, g_CpY + g_DUnit * 4, 0);
	cvs.m_Color = Col;		//選択色に戻す

	return TRUE;
}

bool CMyWnd::OnGetcol() {

	//関連するメニュー、ツールバーボタンを凍結する
	EnableMenuItem(GetMenu(m_hWnd), 1, MF_BYPOSITION | MF_DISABLED);
	ChangeTBState(FALSE);
	//色採取モードにする
	g_GetCol = TRUE;

	return TRUE;
}

bool CMyWnd::OnShiftr() {

	//BMP領域のUndo取り込みとUndoメニュー、ボタンの有効化
	RecordUndo();
	//ビットマップ領域の画像を右端1bit残して取得
	g_Bmp.GetBMP(m_hWnd, cvs.hDC(), g_BmpX, g_BmpY, g_Size - 1, g_Size);
	//ビットマップ領域を矩形に塗潰す
	COLORREF OldCol = cvs.m_Color;
	cvs.Color(15);
	cvs.Box(g_BmpX, g_BmpY, g_BmpX + g_Size, g_BmpY + g_Size, 1);
	cvs.m_Color = OldCol;
	//読んだイメージを右に1bitずらしてBMP領域に表示する
	g_Bmp.PutBMP(m_hWnd, cvs.hDC(), g_BmpX + 1, g_BmpY, 0);
	//変更後のビットマップ領域を取り込む
	cvs.GetBMP(g_BmpX, g_BmpY, g_Size, g_Size);
	//イメージ表示更新
	DrawImage();

	return TRUE;
}

bool CMyWnd::OnShiftl() {

	//BMP領域のUndo取り込みとUndoメニュー、ボタンの有効化
	RecordUndo();
	//ビットマップ領域の画像を左端1bit残して取得
	g_Bmp.GetBMP(m_hWnd, cvs.hDC(), g_BmpX + 1, g_BmpY, g_Size - 1, g_Size);
	//ビットマップ領域を矩形に塗潰す
	COLORREF OldCol = cvs.m_Color;
	cvs.Color(15);
	cvs.Box(g_BmpX, g_BmpY, g_BmpX + g_Size, g_BmpY + g_Size, 1);
	cvs.m_Color = OldCol;
	//読んだイメージを左に1bitずらしてBMP領域に表示する
	g_Bmp.PutBMP(m_hWnd, cvs.hDC(), g_BmpX, g_BmpY, 0);
	//変更後のビットマップ領域を取り込む
	cvs.GetBMP(g_BmpX, g_BmpY, g_Size, g_Size);
	//イメージ表示更新
	DrawImage();

	return TRUE;
}

bool CMyWnd::OnShiftu() {

	//BMP領域のUndo取り込みとUndoメニュー、ボタンの有効化
	RecordUndo();
	//ビットマップ領域の画像を上端1bit残して取得
	g_Bmp.GetBMP(m_hWnd, cvs.hDC(), g_BmpX, g_BmpY + 1, g_Size, g_Size - 1);
	//ビットマップ領域を矩形に塗潰す
	COLORREF OldCol = cvs.m_Color;
	cvs.Color(15);
	cvs.Box(g_BmpX, g_BmpY, g_BmpX + g_Size, g_BmpY + g_Size, 1);
	cvs.m_Color = OldCol;
	//読んだイメージを上に1bitずらしてBMP領域に表示する
	g_Bmp.PutBMP(m_hWnd, cvs.hDC(), g_BmpX, g_BmpY, 0);
	//変更後のビットマップ領域を取り込む
	cvs.GetBMP(g_BmpX, g_BmpY, g_Size, g_Size);
	//イメージ表示更新
	DrawImage();

	return TRUE;
}

bool CMyWnd::OnShiftd() {

	//BMP領域のUndo取り込みとUndoメニュー、ボタンの有効化
	RecordUndo();
	//ビットマップ領域の画像を下端1bit残して取得
	g_Bmp.GetBMP(m_hWnd, cvs.hDC(), g_BmpX, g_BmpY, g_Size, g_Size - 1);
	//ビットマップ領域を矩形に塗潰す
	COLORREF OldCol = cvs.m_Color;
	cvs.Color(15);
	cvs.Box(g_BmpX, g_BmpY, g_BmpX + g_Size, g_BmpY + g_Size, 1);
	cvs.m_Color = OldCol;
	//読んだイメージを上に1bitずらしてBMP領域に表示する
	g_Bmp.PutBMP(m_hWnd, cvs.hDC(), g_BmpX, g_BmpY + 1, 0);
	//変更後のビットマップ領域を取り込む
	cvs.GetBMP(g_BmpX, g_BmpY, g_Size, g_Size);
	//イメージ表示更新
	DrawImage();

	return TRUE;
}

bool CMyWnd::OnLandr() {

	//BMP領域のUndo取り込みとUndoメニュー、ボタンの有効化
	RecordUndo();
	//ビットマップ領域の画像を左右反転して取り込む
	g_Bmp.FlipImage(m_hWnd, g_BmpX, g_BmpY, g_Size, g_Size, TRUE);
	//読んだイメージをBMP領域に表示する
	g_Bmp.PutBMP(m_hWnd, cvs.hDC(), g_BmpX, g_BmpY, 0);
	//変更後のビットマップ領域を取り込む
	cvs.GetBMP(g_BmpX, g_BmpY, g_Size, g_Size);
	//イメージ表示更新
	DrawImage();

	return TRUE;
}

bool CMyWnd::OnUandd() {

	//BMP領域のUndo取り込みとUndoメニュー、ボタンの有効化
	RecordUndo();
	//ビットマップ領域の画像を左右反転して取り込む
	g_Bmp.FlipImage(m_hWnd, g_BmpX, g_BmpY, g_Size, g_Size, FALSE);
	//読んだイメージをBMP領域に表示する
	g_Bmp.PutBMP(m_hWnd, cvs.hDC(), g_BmpX, g_BmpY, 0);
	//変更後のビットマップ領域を取り込む
	cvs.GetBMP(g_BmpX, g_BmpY, g_Size, g_Size);
	//イメージ表示更新
	DrawImage();

	return TRUE;
}

bool CMyWnd::OnClipcopy() {

	//最新のビットマップを取り込む
	g_Bmp.GetBMP(m_hWnd, cvs.hDC(), g_BmpX, g_BmpY, g_Size, g_Size);
	if(g_Bmp.Handle()) {	//読込成功
		g_Bmp.SaveToClipboard();
		return TRUE;
	}
	else {
		MessageBox(m_hWnd, "ビットマップを読み取れませんでした", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
}

bool CMyWnd::OnClippaste() {

	//BMP領域のUndo取り込みとUndoメニュー、ボタンの有効化
	RecordUndo();
	//クリップボードからビットマップ取得、サイズ、色数の記録、描画領再域計算
	if(g_Bmp.LoadFromClipboard()) {
		g_Size = g_Bmp.Width();
		g_BmpCol = g_Bmp.CBits();
		SetSize(m_hWnd);
	}
	else {
		MessageBox(m_hWnd, "クリップボードからイメージを取得できませんでした", "エラー", MB_OK | MB_ICONSTOP);
		//Undo処理のキャンセル
		CancelUndo();
		return FALSE;
	}
	//クリップボードから読み込んだビットマップの張り付け
	g_Bmp.PutBMP(m_hWnd, cvs.hDC(), g_BmpX, g_BmpY, 0);
	//変更後のビットマップ領域を取り込む
	cvs.GetBMP(g_BmpX, g_BmpY, g_Size, g_Size);
	//イメージ表示更新
	DrawImage();

	return TRUE;
}

bool CMyWnd::OnDisplay() {

	MessageBox(m_hWnd, "次に表示されるビットマップ情報は必ずしも画像ファイルのビットマップ情報とは一致しません。\n\nファイル読み込み直後ではファイルのビットマップ情報（DIB情報）になりますが、描画や反転、シフト等のビットマップのイメージ処理を行った後では、本EZImageウィンドウ上のビットマップ（DDB）として表示されるからです。\n\nご利用の際には充分ご注意ください。", "注意", MB_OK | MB_ICONEXCLAMATION);
	//IDD_BMPINFOダイアログの表示
	bmpinfodlg.DoModal(m_hWnd, "IDD_BMPINFO", bmpinfodlgProc);

	return TRUE;
}

bool CMyWnd::OnHelp() {

	//ヘルプファイルの表示
	WinExec(g_HelpFile, SW_SHOWNORMAL);

	return TRUE;
}

bool CMyWnd::OnShortCut() {

	MessageBox(m_hWnd,
	"Return−決定（IDOK）\nEsc−キャンセル（IDCANCEL）\n\n"\
	"Ctrl+N−新規イメージ\nCtrl+O−イメージを開く\nCtrl+S−イメージの保存\nCtrl+X−EZImageの終了\n\n"\
	"Ctrl+U−元に戻す\nSpace−イメージの一部のコピー\nCtrl+Space−イメージの一部の貼り付け\n\n"\
	"Ctrl+C−クリップボードにコピー\nCtrl+V−クリップボードから貼り付け\n\n"\
	"F1−ヘルプ\nF2−ショートカットキー（本メニュー）\nF3−バージョン情報",
	"ショートカットキーの解説", MB_OK | MB_ICONINFORMATION);

	return TRUE;
}

bool CMyWnd::OnVersion() {

	//IDD_VERSIONダイアログの表示
	versiondlg.DoModal(m_hWnd, "IDD_VERSION", versiondlgProc);

	return TRUE;
}

bool CMyWnd::OnDefault(WPARAM wParam) {	//WM_COMMANDの特殊処理

	char menuitem[MAX_PATH];
	int num = LOWORD(wParam) - IDM_HISTORY;
	if(num >= 0 && num < ITEM_MAX) {
		MENUITEMINFO mii = {0};	//ZeroMemory(&mii, sizeof(MENUITEMINFO));と同じ初期設定
		mii.cbSize		= sizeof(MENUITEMINFO);
		mii.fMask		= MIIM_ID | MIIM_TYPE;
		mii.fType		= MFT_STRING;
		mii.dwTypeData	= NULL;
		if(GetMenuItemInfo(GetSubMenu(GetSubMenu(GetMenu(m_hWnd), 0), 5), num, TRUE, &mii)) {
			mii.fType		= MFT_STRING;
			mii.dwTypeData	= menuitem;
			mii.cch++;
			if(GetMenuItemInfo(GetSubMenu(GetSubMenu(GetMenu(m_hWnd), 0), 5), num, TRUE, &mii)) {
				lstrcpy(g_FileName, menuitem);
				g_ByFile = TRUE;
				OnOpen();
				return TRUE;
			}
		}
	}
	return FALSE;
}

//////////////////////
//ユーザー定義関数
//ウィンドウ画面の描画
//////////////////////
void CMyWnd::DrawImage() {

	//描画開始
	COLORREF Old_Color = cvs.m_Color;	//選択色を保存
	cvs.Clear();
	//ビットマップの原寸大と拡大表示
	cvs.PutBMP(g_BmpX, g_BmpY, 0);		//最後の0はPSET
	cvs.FitBMP(g_DrawX, g_DrawY, g_DrawW, g_DrawH, 0);
	//ビットマップ領域と描画領域の境界線（黒）描画
	int i, j;
	cvs.Color(0);
	//ビットマップ領域
	cvs.Box(g_BmpX - 1, g_BmpY - 1, g_BmpX + g_Size + 1, g_BmpY + g_Size + 1);
	//拡大描画領域の境界線描画
	for(i = 0; i <= g_Size; i++) {
		cvs.Line(g_DrawX, g_DrawY + i * g_DUnit, g_DrawX + g_DrawW, g_DrawY + i * g_DUnit);
		cvs.Line(g_DrawX + i * g_DUnit, g_DrawY, g_DrawX + i * g_DUnit, g_DrawY + g_DrawH);
	}
	//16色パレット描画
	g_CpX = (g_ClientW / 2 - g_DUnit * 8) / 2 + g_ClientW / 2;
	g_CpY = g_BmpY * 2;
	int Col = 0;
	for(i = g_CpY; i <= (g_CpY + g_DUnit); i += g_DUnit) {
		for(j = g_CpX; j <= (g_CpX + g_DUnit * 7); j += g_DUnit) {
			cvs.Color(Col);
			cvs.Box(j, i, j + g_DUnit + 1, i + g_DUnit + 1, 1);
			cvs.Color(0);
			cvs.Box(j, i, j + g_DUnit + 1, i + g_DUnit + 1, 0);
			Col++;
		}
	}
	//選択色の表示
	cvs.m_Color = Old_Color;	//保存していた選択色に復帰
	cvs.Box(g_CpX, g_CpY + g_DUnit * 3, g_CpX + g_DUnit, g_CpY + g_DUnit * 4, 1);
	cvs.Color(0);				//黒色で枠線を描く
	cvs.Box(g_CpX, g_CpY + g_DUnit * 3, g_CpX + g_DUnit, g_CpY + g_DUnit * 4, 0);
	cvs.m_Color = Old_Color;	//保存していた選択色に復帰
	//ウィンドウ描画更新
	InvalidateRect(m_hWnd, 0, TRUE);
}

bool CMyWnd::RecordUndo() {

	//BMP領域のUndo取り込みとUndoメニュー、ボタンの有効化
	if(g_UndoPtr < MAX_UNDO) {	//「元に戻す」はMAX_UNDO回まで
		g_Bmp.GetBMP(m_hWnd, cvs.hDC(), g_BmpX, g_BmpY, g_Size, g_Size);
		g_Undo[g_UndoPtr] = (HBITMAP)CopyImage(g_Bmp.Handle(), IMAGE_BITMAP, 0, 0,
							LR_COPYRETURNORG);	//ビットマップを保存
		g_UndoPtr++;
		//g_UndoPtrの初期値は0で、描画処理で必ず増えるため"g_UndoPtr > 0"条件不要
		EnableMenuItem(GetSubMenu(GetMenu(m_hWnd), 1), IDM_UNDO, MF_BYCOMMAND | MF_ENABLED);
		SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_UNDO, (LPARAM)TBSTATE_ENABLED);
		return TRUE;
	}
	else {	//g_UndoPtrの初期値は0で、描画処理で必ず増えるためメッセージ表示だけ
		MessageBox(m_hWnd, "Undoバッファが一杯になりました。\nこれ以上記録できません。",
					"警告", MB_OK | MB_ICONSTOP);
		return FALSE;
	}
}

void CMyWnd::CancelUndo() {

	//Undo処理のキャンセル
	g_UndoPtr--;
	DeleteObject(g_Undo[g_UndoPtr]);
	g_Undo[g_UndoPtr] = 0;
	if(!g_UndoPtr) {
		EnableMenuItem(GetSubMenu(GetMenu(m_hWnd), 1), IDM_UNDO, MF_BYCOMMAND | MF_DISABLED);
		SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_UNDO, (LPARAM)TBSTATE_INDETERMINATE);
	}
}

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

	if(g_Size == 32)
		SendItemMsg(IDC_RB32, BM_SETCHECK, BST_CHECKED, 0);
		else
		SendItemMsg(IDC_RB16, BM_SETCHECK, BST_CHECKED, 0);

	return TRUE;
}
bool NEWDLG::OnIdok() {

	if(SendItemMsg(IDC_RB32, BM_GETCHECK, 0, 0) == BST_CHECKED)
		g_Size = 32;
	else
		g_Size = 16;
	EndModal(TRUE);

	return TRUE;
}

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

	switch(g_ImageType) {
	case 0:	//ビットマップ
		SendItemMsg(IDC_RBBITMAP, BM_SETCHECK, BST_CHECKED, 0);
		ShowWindow(GetDlgItem(m_hWnd,IDC_HOTSPOT), SW_HIDE);
		break;
	case 1:	//アイコン
		SendItemMsg(IDC_RBICON, BM_SETCHECK, BST_CHECKED, 0);
		ShowWindow(GetDlgItem(m_hWnd,IDC_HOTSPOT), SW_HIDE);
		break;
	case 2:	//カーソル
		SendItemMsg(IDC_RBCUR, BM_SETCHECK, BST_CHECKED, 0);
		ShowWindow(GetDlgItem(m_hWnd,IDC_HOTSPOT), SW_SHOW);
		break;
	}
	SetCol(GetCol());

	return TRUE;
}

bool SAVEDLG::OnRbbitmap() {

	if(SendItemMsg(IDC_RBBITMAP, BM_GETCHECK, BST_CHECKED, 0)) {
		SetCol(GetCol());
//		EnableWindow(GetDlgItem(m_hWnd,IDC_HOTSPOT), FALSE);
		ShowWindow(GetDlgItem(m_hWnd,IDC_HOTSPOT), SW_HIDE);
	}
	return TRUE;
}

bool SAVEDLG::OnRbicon() {

	if(SendItemMsg(IDC_RBICON, BM_GETCHECK, BST_CHECKED, 0)) {
		SetCol(GetCol());
//		EnableWindow(GetDlgItem(m_hWnd,IDC_HOTSPOT), FALSE);
		ShowWindow(GetDlgItem(m_hWnd,IDC_HOTSPOT), SW_HIDE);
	}
	return TRUE;
}

bool SAVEDLG::OnRbcur() {

	if(SendItemMsg(IDC_RBCUR, BM_GETCHECK, BST_CHECKED, 0)) {
		SetCol(GetCol());
//		EnableWindow(GetDlgItem(m_hWnd,IDC_HOTSPOT), FALSE);
		ShowWindow(GetDlgItem(m_hWnd,IDC_HOTSPOT), SW_SHOW);
	}
	return TRUE;
}

bool SAVEDLG::OnHotspot() {

	hotspotdlg.DoModal(m_hWnd, "IDD_HOTSPOT", hotspotdlgProc);
	return TRUE;
}

bool SAVEDLG::OnIdok() {

	//ビットマップ = 0、アイコン = 1、カーソル = 2
	if(SendItemMsg(IDC_RBBITMAP, BM_GETCHECK, BST_CHECKED, 0))
		g_ImageType = 0;
	else if(SendItemMsg(IDC_RBICON, BM_GETCHECK, BST_CHECKED, 0))
		g_ImageType = 1;
	else if(SendItemMsg(IDC_RBCUR, BM_GETCHECK, BST_CHECKED, 0))
		g_ImageType = 2;
	//モノクロ-1、16色-4、256色-8、16bit-16、24bit-24、32bit-32
	if(SendItemMsg(IDC_RB2C, BM_GETCHECK, BST_CHECKED, 0))
		g_BmpCol = 1;
	else if(SendItemMsg(IDC_RB16C, BM_GETCHECK, BST_CHECKED, 0))
		g_BmpCol = 4;
	else if(SendItemMsg(IDC_RB256C, BM_GETCHECK, BST_CHECKED, 0))
		g_BmpCol = 8;
	else if(SendItemMsg(IDC_RB16BIT, BM_GETCHECK, BST_CHECKED, 0))
		g_BmpCol = 16;
	else if(SendItemMsg(IDC_RB24BIT, BM_GETCHECK, BST_CHECKED, 0))
		g_BmpCol = 24;
	else if(SendItemMsg(IDC_RB32BIT, BM_GETCHECK, BST_CHECKED, 0))
		g_BmpCol = 32;
    EndModal(TRUE);

	return TRUE;
}

int SAVEDLG::GetCol() {

	int Col = 0;
	//現状の色選択を確認
	if(SendItemMsg(IDC_RB2C, BM_GETCHECK, 0, 0) == BST_CHECKED)
		Col = 1;
	else if(SendItemMsg(IDC_RB16C, BM_GETCHECK, 0, 0) == BST_CHECKED)
		Col = 4;
	else if(SendItemMsg(IDC_RB256C, BM_GETCHECK, 0, 0) == BST_CHECKED)
		Col = 8;
	else if(SendItemMsg(IDC_RB16BIT, BM_GETCHECK, 0, 0) == BST_CHECKED)
		Col = 16;
	else if(SendItemMsg(IDC_RB24BIT, BM_GETCHECK, 0, 0) == BST_CHECKED)
		Col = 24;
	else if(SendItemMsg(IDC_RB32BIT, BM_GETCHECK, 0, 0) == BST_CHECKED)
		Col = 32;
	else
	//ダイアログを開いた時点では選択がないので外部変数で初期化する
		Col = g_BmpCol;
	//一旦現在の色チェックを外す
	switch(Col) {
	case 1:
		SendItemMsg(IDC_RB2C, BM_SETCHECK, BST_UNCHECKED, 0);
		break;
	case 4:
		SendItemMsg(IDC_RB16C, BM_SETCHECK, BST_UNCHECKED, 0);
		break;
	case 8:
		SendItemMsg(IDC_RB256C, BM_SETCHECK, BST_UNCHECKED, 0);
		break;
	case 16:
		SendItemMsg(IDC_RB16BIT, BM_SETCHECK, BST_UNCHECKED, 0);
		break;
	case 24:
		SendItemMsg(IDC_RB24BIT, BM_SETCHECK, BST_UNCHECKED, 0);
		break;
	case 32:
		SendItemMsg(IDC_RB32BIT, BM_SETCHECK, BST_UNCHECKED, 0);
		break;
	}
	return Col;
}

void SAVEDLG::SetCol(int Col) {

	switch(Col) {
	case 1:
		SendItemMsg(IDC_RB2C, BM_SETCHECK, BST_CHECKED, 0);
		break;
	case 4:
		SendItemMsg(IDC_RB16C, BM_SETCHECK, BST_CHECKED, 0);
		break;
	case 8:
		SendItemMsg(IDC_RB256C, BM_SETCHECK, BST_CHECKED, 0);
		break;
	case 16:
		SendItemMsg(IDC_RB16BIT, BM_SETCHECK, BST_CHECKED, 0);
		break;
	case 24:
		SendItemMsg(IDC_RB24BIT, BM_SETCHECK, BST_CHECKED, 0);
		break;
	case 32:
		SendItemMsg(IDC_RB32BIT, BM_SETCHECK, BST_CHECKED, 0);
		break;
	}
}

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

	//入力文字を4文字に制限する
	SendItemMsg(IDC_HOTSPOTX, EM_SETLIMITTEXT, 3, 0);
	SendItemMsg(IDC_HOTSPOTY, EM_SETLIMITTEXT, 3, 0);
	//HotSpot（g_hsx, g_hsy）の設定
	char buff[4];
	wsprintf(buff, "%d", g_hsx);
	SendItemMsg(IDC_HOTSPOTX, WM_SETTEXT, 0, (LPARAM)buff);
	wsprintf(buff, "%d", g_hsy);
	SendItemMsg(IDC_HOTSPOTY, WM_SETTEXT, 0, (LPARAM)buff);

	return TRUE;
}

bool HOTSPOTDLG::OnIdok() {

	int i;
	char buff[4];
	SendItemMsg(IDC_HOTSPOTX, WM_GETTEXT, 4, (LPARAM)buff);
	i = atoi(buff);
	if(i < 0 || i > g_Size - 1) {
		MessageBox(m_hWnd, "カーソルサイズ（0 - 15または31）外になっています", "エラー", MB_OK | MB_ICONERROR);
		return TRUE;
	}
	else
		g_hsx = i;
	SendItemMsg(IDC_HOTSPOTY, WM_GETTEXT, 4, (LPARAM)buff);
	i = atoi(buff);
	if(i < 0 || i > g_Size - 1) {
		 MessageBox(m_hWnd, "カーソルサイズ（0 - 15または31）外になっています", "エラー", MB_OK | MB_ICONERROR);
		 return TRUE;
	}
	else
		g_hsy = i;
	EndModal(TRUE);

	return TRUE;
}

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

	if(g_Bmp.Handle())
		//ビットマップ情報ダイアログの初期化（User.h参照）
		EnableAllControls(TRUE);
	else {
		MessageBox(m_hWnd, "まだビットマップが読み込まれていません", "Error", MB_OK | MB_ICONERROR);
		EndModal(TRUE);
	}

	return TRUE;
}

bool BMPINFODLG::OnIdhelp() {

	//ヘルプメッセージボックスの表示
	PBITMAPINFOHEADER pbih = (PBITMAPINFOHEADER)g_Bmp.m_PBmi;
	DWORD Offset, Size;
	if(!g_ImageType) {
		Offset = g_Bmp.m_PBmf->bfOffBits;
		Size = pbih->biSizeImage;
	}
	else {
		Offset = g_Bmp.m_icondirentry.dwImageOffset;
		Size = g_Bmp.m_icondirentry.dwBytesInRes;
	}
	HowtoReadBitmapInfo(g_FileName, pbih->biWidth, pbih->biHeight,
							pbih->biBitCount, Size, Offset,
							g_Bmp.m_Bmp.bmWidth, g_Bmp.m_Bmp.bmHeight,
							g_Bmp.m_Bmp.bmBitsPixel);

	return TRUE;
}

bool BMPINFODLG::OnIdok() {

	EndModal(TRUE);

	return TRUE;
}

////////////////////////////////////////
//ビットマップ情報の確認･検証ダイアログ
////////////////////////////////////////
void BMPINFODLG::HowtoReadBitmapInfo(char* szFileName, long wx, long wy,
							WORD wBitCount, DWORD dwSizeImage, DWORD dwOffBits,
							long wx2, long wy2, WORD wBitsPixel) {

	char str[MAX_PATH * 4];
	if(!g_ImageType)
		wsprintf(str,
		"ビットマップファイル情報（ファイル名：%s）\r\n\r\n"
		"BMP幅 = %d, BMP高さ = %d\r\n"
		"カラービット(biBitCount) = %d\r\n"
		"（色数 %d = 2^(biBitCount x プレーン数(1)\r\n"
		"bfOffBits = %d, biSizeImage = %d\r\n\r\n"
		"<bfOffBitsの計算>\r\n"
		"  BITMAPFILEHEADER構造体(= 14バイト)\r\n"
		"+ BITMAPINFOHEADER構造体(= 40バイト)\r\n"
		"+ RGBQUAD構造体配列(= 4バイト x 2^カラービット)\r\n"
		"（注：このカラーパレットは16カラービット以上は0となる）\r\n"
		"-------------------------------------------------------\r\n"
		"= 14 + 40 + 4 x 色数(%d)\r\n"
		"= %dバイト\r\n\r\n"
		"<biSizeImageの計算>\r\n"
		"  (BMP幅 x biBitCount / 8)を4の倍数に繰り上げ x BMP高さ\r\n"
		"------------------------------------------------------------\r\n"
		"= (BMP幅 x biBitCount / 8)の繰上4の倍数(%d) x BMP高さ(%d)\r\n"
		"= %dバイト\r\n\r\n"
		"<ビットマップ情報（GetObject()関数でDDB情報を取得）>\r\n"
		"BMP幅 = %d, BMP高さ = %d\r\n"
		"カラービット(bmBitsPixel) = %d\r\n",
		szFileName,
		wx, wy,
		wBitCount,
		1 << (wBitCount * 1),
		dwOffBits, dwSizeImage,
		(wBitCount > 8) ? 0 : (1 << (wBitCount * 1)),
		14 + 40 + 4 * ((wBitCount > 8) ? 0 : (1 << (wBitCount * 1))),
		((wx * wBitCount + 31) & ~31) / 8, wy, (((wx * wBitCount + 31) & ~31) / 8) * wy,
		wx2, wy2,
		wBitsPixel);
	else
		wsprintf(str,
		"アイコン・カーソルファイル情報（ファイル名：%s）\r\n"
		"BMP幅 = %d, BMP高さ = %d\r\n"
		"カラービット(biBitCount) = %d（色数 %d = 2^(biBitCount x プレーン数(1)）\r\n"
		"dwImageOffset = %d, dwBytesInRes = %d\r\n\r\n"
		"<dwImageOffsetの計算>\r\n"
		"ICONDIR構造体(6バイト) + ICONDIRENTRY構造体16バイト) * 画像数 + 先行画像データ\r\n"
		"= %dバイト\r\n"
		"<dwBytesInResの計算>\r\n"
		"  BITMAPINFOHEADER構造体(40バイト)\r\n"
		"+ RGBQUAD構造体配列(4バイト x 2^カラービット、但し16カラービット以上は0となる）\r\n"
		"+ カラー(XOR)ビットマップ（下式１）"
		"+ マスク(AND)ビットマップ（下式２）"
		"-------------------------------------------------------\r\n"
		"= 40 + 4 x %d + %d + %d = %dバイト\r\n"
		"<式１：カラービットマップサイズの計算>\r\n"
		"(BMP幅 x biBitCount / 8)の繰上4の倍数(%d) x BMP高さ(%d)\r\n"
		"= %dバイト\r\n"
		"<式２：マスクビットマップサイズの計算>\r\n"
		"(BMP幅 / 8)の繰上4の倍数(%d) x 高さ(%d)\r\n"
		"= %dバイト\r\n"
		"<ビットマップ情報（GetObject()関数でDDB情報を取得）>\r\n"
		"BMP幅 = %d, BMP高さ = %d\r\n"
		"カラービット(bmBitsPixel) = %d\r\n",
		szFileName,
		wx, wy,
		wBitCount,
		1 << (wBitCount * 1),
		dwOffBits, dwSizeImage,
		dwOffBits,
		(wBitCount > 8) ? 0 : (1 << (wBitCount * 1)), (((wx * wBitCount + 31) & ~31) / 8) * wy, (((wx + 31) & ~31) / 8) * wy,
		40 + 4 * ((wBitCount > 8) ? 0 : (1 << (wBitCount * 1))) + (((wx * wBitCount + 31) & ~31) / 8) * wy + (((wx + 31) & ~31) / 8) * wy,
		((wx * wBitCount + 31) & ~31) / 8, wy,
		((wx * wBitCount + 31) & ~31) / 8 * wy,
		(((wx + 31) & ~31) / 8), wy,
		(((wx + 31) & ~31) / 8) * wy,
		wx2, wy2,
		wBitsPixel);
	MessageBox(NULL, str, "BITMAP情報の読み方と検証", MB_OK);
}

/////////////////////////////////////////////////
//ビットマップ情報ダイアログコントロールの初期化
/////////////////////////////////////////////////
void BMPINFODLG::EnableAllControls(bool flag) {

	//最初と最後のコントロールID
	for(int i = IDC_BMTYPE; i < IDC_CLRBIT; i++)
		SendItemMsg(i, EM_SETREADONLY, TRUE, 0);
	SendItemMsg(IDC_CLRBIT, EM_SETREADONLY, flag, 0);
	//左列データ（BITMAP構造体）の設定
	CSTR str;
	str = g_Bmp.m_Bmp.bmType;
	SendItemMsg(IDC_BMTYPE, WM_SETTEXT, 0, (LPARAM)str.ToChar());
	str = g_Bmp.m_Bmp.bmWidth;
	SendItemMsg(IDC_BMWIDTH, WM_SETTEXT, 0, (LPARAM)str.ToChar());
	str = g_Bmp.m_Bmp.bmHeight;
	SendItemMsg(IDC_BMHEIGHT, WM_SETTEXT, 0, (LPARAM)str.ToChar());
	str = g_Bmp.m_Bmp.bmWidthBytes;
	SendItemMsg(IDC_BMWIDTHBYTES, WM_SETTEXT, 0, (LPARAM)str.ToChar());
	str = g_Bmp.m_Bmp.bmPlanes;
	SendItemMsg(IDC_BMPLANES, WM_SETTEXT, 0, (LPARAM)str.ToChar());
	str = g_Bmp.m_Bmp.bmBitsPixel;
	SendItemMsg(IDC_BMBITSPIXEL, WM_SETTEXT, 0, (LPARAM)str.ToChar());
	str = (long)g_Bmp.m_Bmp.bmBits;
	SendItemMsg(IDC_BMBITS, WM_SETTEXT, 0, (LPARAM)str.ToChar());
	//中央列データ（BITMAPFILEHEADER）の設定（アイコン、カーソルはN/A）
	if(!g_ImageType) {
		str = "        ";
		wsprintf(str.ToChar(), "0x%4X", g_Bmp.m_PBmf->bfType);
		SendItemMsg(IDC_BFTYPE, WM_SETTEXT, 0, (LPARAM)str.ToChar());
		str = g_Bmp.m_PBmf->bfSize;
		SendItemMsg(IDC_BFSIZE, WM_SETTEXT, 0, (LPARAM)str.ToChar());
		str = g_Bmp.m_PBmf->bfReserved1;
		SendItemMsg(IDC_BFRESERVED1, WM_SETTEXT, 0, (LPARAM)str.ToChar());
		str = g_Bmp.m_PBmf->bfReserved2;
		SendItemMsg(IDC_BFRESERVED2, WM_SETTEXT, 0, (LPARAM)str.ToChar());
		str = g_Bmp.m_PBmf->bfOffBits;
		SendItemMsg(IDC_BFOFFBITS, WM_SETTEXT, 0, (LPARAM)str.ToChar());
	}
	else {
		str = "N/A";
		SendItemMsg(IDC_BFTYPE, WM_SETTEXT, 0, (LPARAM)str.ToChar());
		SendItemMsg(IDC_BFSIZE, WM_SETTEXT, 0, (LPARAM)str.ToChar());
		SendItemMsg(IDC_BFRESERVED1, WM_SETTEXT, 0, (LPARAM)str.ToChar());
		SendItemMsg(IDC_BFRESERVED2, WM_SETTEXT, 0, (LPARAM)str.ToChar());
		SendItemMsg(IDC_BFOFFBITS, WM_SETTEXT, 0, (LPARAM)str.ToChar());
	}
	//右列データ（PBITMAPINFOHEADER）の設定
	PBITMAPINFOHEADER pbih = (PBITMAPINFOHEADER)g_Bmp.m_PBmi;
	str = pbih->biSize;
	SendItemMsg(IDC_BISIZE, WM_SETTEXT, 0, (LPARAM)str.ToChar());
	str = pbih->biWidth;
	SendItemMsg(IDC_BIWIDTH, WM_SETTEXT, 0, (LPARAM)str.ToChar());
	str = pbih->biHeight;
	SendItemMsg(IDC_BIHEIGHT, WM_SETTEXT, 0, (LPARAM)str.ToChar());
	str = pbih->biPlanes;
	SendItemMsg(IDC_BIPLANES, WM_SETTEXT, 0, (LPARAM)str.ToChar());
	str = pbih->biBitCount;
	SendItemMsg(IDC_BIBITCOUNT, WM_SETTEXT, 0, (LPARAM)str.ToChar());
	str = pbih->biCompression;
	SendItemMsg(IDC_BICOMPRESSION, WM_SETTEXT, 0, (LPARAM)str.ToChar());
	str = pbih->biSizeImage;
	SendItemMsg(IDC_BISIZEIMAGE, WM_SETTEXT, 0, (LPARAM)str.ToChar());
	str = pbih->biXPelsPerMeter;
	SendItemMsg(IDC_BIXPELSPM, WM_SETTEXT, 0, (LPARAM)str.ToChar());
	str = pbih->biYPelsPerMeter;
	SendItemMsg(IDC_BIYPELSPM, WM_SETTEXT, 0, (LPARAM)str.ToChar());
	str = pbih->biClrUsed;
	SendItemMsg(IDC_BICLRUSED, WM_SETTEXT, 0, (LPARAM)str.ToChar());
	str = pbih->biClrImportant;
	SendItemMsg(IDC_BICLRIMPT, WM_SETTEXT, 0, (LPARAM)str.ToChar());
	//最下端のカラービット
	str = g_Bmp.CBits();
	SendItemMsg(IDC_CLRBIT, WM_SETTEXT, 0, (LPARAM)str.ToChar());
}

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

	EndModal(TRUE);

	return TRUE;
}
