//////////////////////////////////////////
// IconViewerProc.h
// Copyright (c) 04/09/2021 by BCCSkelton
//////////////////////////////////////////

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

	//コモンコントロールの初期化
	InitCommonControls();
	//ツールバー登録−SetHandle(hWnd))
	TBar.SetHandle(GetDlgItem(m_hWnd, IDC_TOOLBAR));
	//ツールバーボタン用カスタムビットマップ追加
	TBar.AddBmp(m_hInstance, MAKEINTRESOURCE(IDI_TBAR), 9);
	//ツールバーボタン追加
	TBBUTTON tbb[13];
	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_OPEN;
	tbb[1].iBitmap = TBar.m_id + 1;
	tbb[1].fsState = TBSTATE_ENABLED;
	tbb[1].fsStyle = TBSTYLE_BUTTON;
	tbb[1].idCommand = IDM_SAVE;
	tbb[2].iBitmap = TBar.m_id + 2;
	tbb[2].fsState = TBSTATE_ENABLED;
	tbb[2].fsStyle = TBSTYLE_BUTTON;
	tbb[2].idCommand = IDM_BMPSAVE;
	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].fsState = TBSTATE_ENABLED;
	tbb[6].fsStyle = TBSTYLE_BUTTON;
	tbb[6].idCommand = IDM_ADD;
	tbb[7].iBitmap = TBar.m_id + 5;
	tbb[7].fsState = TBSTATE_ENABLED;
	tbb[7].fsStyle = TBSTYLE_BUTTON;
	tbb[7].idCommand = IDM_DELETE;
	tbb[8].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[9].iBitmap = TBar.m_id + 6;
	tbb[9].fsState = TBSTATE_ENABLED;
	tbb[9].fsStyle = TBSTYLE_BUTTON;
	tbb[9].idCommand = IDM_DISPLAY;
	tbb[10].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[11].iBitmap = TBar.m_id + 7;
	tbb[11].fsState = TBSTATE_ENABLED;
	tbb[11].fsStyle = TBSTYLE_BUTTON;
	tbb[11].idCommand = IDM_HELP;
	tbb[12].iBitmap = TBar.m_id + 8;
	tbb[12].fsState = TBSTATE_ENABLED;
	tbb[12].fsStyle = TBSTYLE_BUTTON;
	tbb[12].idCommand = IDM_VERSION;
	TBar.AddButtons(13, tbb);
	//ステータスバー登録−SetHandle(hWnd))
	SBar.SetHandle(GetDlgItem(m_hWnd, IDC_STATUSBAR));
	//ステータスバー区画設定
	int sec[2] = {120, -1};
	SBar.SetSection(2, sec);
	//ステータスバー文字列設定
	SBar.SetText(0, "IconViewer Ver2.0");
	//ファイルパスの設定
	g_HelpFile = Arg.Path();
	g_HelpFile = g_HelpFile + "\\IconViewerHelp.chm";
	//CICONインスタンスの初期化
	g_Icon.SetWindow(m_hWnd);
	//リストビュー拡張スタイルの設定
	INITCOMMONCONTROLSEX ic;
	ic.dwSize = sizeof(ic);
	ic.dwICC = ICC_LISTVIEW_CLASSES;
	InitCommonControlsEx(&ic);
	DWORD lvStyle = SendItemMsg(IDC_LISTVIEW, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);
	lvStyle |= LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES;
	SendItemMsg(IDC_LISTVIEW, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES, lvStyle);
	//リストビューの初期化
	char* column[11] = {"bWidth", "bHeight", "bColorCount", "dwBitCount",
						"dwBytesInRes", "dwImageOffset", "biWidth",
						"biHeight", "biPlanes", "biBitCount", "biSizeImage"};
	int w[11] = {60, 60, 80, 80, 90, 100, 60, 60, 60, 80, 80};
	LV_COLUMN lvcol;
	lvcol.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
	lvcol.fmt = LVCFMT_LEFT;
	for(int i = 0; i < 11; i++) {
		lvcol.cx = w[i];
		lvcol.pszText = column[i];
		lvcol.iSubItem = i;
		SendItemMsg(IDC_LISTVIEW, LVM_INSERTCOLUMN, i, (LPARAM)&lvcol);
	}
 	//ポップアップメニューの設定
	g_hPopup = GetSubMenu(GetMenu(m_hWnd), 1);
	//データファイルで起動された場合、ファイルをオープンする
	if(g_ByFile) {
		g_FileName = Arg.v(1);
		OnOpen();
	}
	//ドラッグアンドドロップを開始する
	DragAcceptFiles(m_hWnd, TRUE);
	return TRUE;
}

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

	//ツールバーのツールチップ処理
	if(((LPNMHDR)lParam)->code == TTN_NEEDTEXT) {
		switch(((LPTOOLTIPTEXT)lParam)->hdr.idFrom) {
		case IDM_OPEN:
			((LPTOOLTIPTEXT)lParam)->lpszText = "アイコンを開く";
			break;
		case IDM_SAVE:
			((LPTOOLTIPTEXT)lParam)->lpszText = "アイコンの保存";
			break;
		case IDM_BMPSAVE:
			((LPTOOLTIPTEXT)lParam)->lpszText = "構成ビットマップの保存";
			break;
		case IDM_EXIT:
			((LPTOOLTIPTEXT)lParam)->lpszText = "終了";
			break;
		case IDM_ADD:
			((LPTOOLTIPTEXT)lParam)->lpszText = "イメージの追加";
			break;
		case IDM_DELETE:
			((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;
	}
	else if((int)wParam == IDC_LISTVIEW) {	//リストビューからのメッセージ
		if(((LPNMLISTVIEW)lParam)->hdr.code == NM_CLICK){
			int n = ListView_GetNextItem(GetDlgItem(m_hWnd, IDC_LISTVIEW), -1,
										LVNI_ALL | LVIS_SELECTED);
			if(n== -1) {
				MessageBox(m_hWnd, "選択されていません", "エラー", MB_OK | MB_ICONERROR);
				return FALSE;
			}
			//ビットマップを表示
			SendItemMsg(IDC_BMPVIEW, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)g_Icon.GetColBmp(n));
			SendItemMsg(IDC_MSKVIEW, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)g_Icon.GetMaskBmp(n));
			//エディットボックスの表示
			ShowIconData(n);
		}
		else if(((LPNMLISTVIEW)lParam)->hdr.code == NM_RCLICK) {
			//ウインドウの位置情報を取得
			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;
	}
	return FALSE;
}

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

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

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

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

	return TRUE;
}

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

	PostQuitMessage(0);
	return TRUE;
}

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

	if(g_ByFile)
		g_ByFile = FALSE;
	else {
		char* cp = cmndlg.GetFileName(m_hWnd, "アイコンファイル(*.ico)\0*.ico\0カーソルファイル(*.cur)\0*.cur\0\0", TRUE);
		if(cp)
			g_FileName = cp;	//cpがNULLでなければファイル名をg_FileNameへコピー
		else {
			MessageBox(m_hWnd, "操作はキャンセルされました", "メッセージ", MB_OK | MB_ICONERROR);
			return FALSE;
		}
	}
	//ファイル読込処理
	if(strstr(g_FileName.ToChar(), ".ico") || strstr(g_FileName.ToChar(), ".ICO")) {	//Iconファイル
		g_ImageType = IMAGE_ICON;
		if(!g_Icon.Load_Icon(g_FileName.ToChar(), IMAGE_ICON, TRUE)) {
			MessageBox(m_hWnd, "アイコンファイルを読み込めませんでした", "エラー", MB_OK | MB_ICONSTOP);
			return FALSE;
		}
	}
	else if(strstr(g_FileName.ToChar(), ".cur") || strstr(g_FileName.ToChar(), ".CUR")) {	//Cursorファイル
		g_ImageType = IMAGE_CURSOR;
		if(!g_Icon.Load_Icon(g_FileName.ToChar(), IMAGE_CURSOR, TRUE)) {
			MessageBox(m_hWnd, "カーソルファイルを読み込めませんでした", "エラー", MB_OK | MB_ICONSTOP);
			return FALSE;
		}
	}
	//アイコンを表示
	SendItemMsg(IDC_ICONVIEW, STM_SETIMAGE, IMAGE_ICON, (LPARAM)g_Icon.GetIcon());
	//リストビューに登録ビットマップ情報を表示
	SetListView();
	//ファイル名をステータスバーに表示
	SBar.SetText(1, g_FileName.ToChar());
	SBar.SendMsg(SB_SETTIPTEXT, 1, (LPARAM)g_FileName.ToChar());	//ToolTipをつける
	return TRUE;
}

bool ICONVIEWER::OnSave() {

	if(!*g_FileName.ToChar())
		OnSaveas();
	else
		g_Icon.Save_Icon(g_FileName.ToChar(), g_ImageType);
	return TRUE;
}

bool ICONVIEWER::OnSaveas() {

	char *flt, *ext;
	//IDD_SAVEダイアログの表示
	savedlg.DoModal(m_hWnd, "IDD_SAVE", savedlgProc);
	if(g_ImageType == IMAGE_ICON) {
		flt = "アイコンファイル(*.ico)\0*.ico\0\0";
		ext = "ico";
	}
	else {
		flt = "カーソルファイル(*.cur)\0*.cur\0\0";
		ext = "cur";
		int num = g_Icon.GetCount();
		for(int i = 0; i < num; i++) {
			//ビットマップを表示
			SendItemMsg(IDC_BMPVIEW, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)g_Icon.GetColBmp(i));
			SendItemMsg(IDC_MSKVIEW, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)g_Icon.GetMaskBmp(i));
			//ホットスポットの設定
			g_Num = i;
			hotspotdlg.DoModal(m_hWnd, "IDD_HOTSPOT", hotspotdlgProc);
		}
	}
	char* cp = cmndlg.GetFileName(m_hWnd, flt, FALSE, ext);
	if(cp)
		g_FileName = cp;	//cpがNULLでなければファイル名をg_FileNameへコピー
	else {
		MessageBox(m_hWnd, "操作はキャンセルされました", "メッセージ", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	g_Icon.Save_Icon(g_FileName.ToChar(), g_ImageType);
	//ファイル名をステータスバーに表示
	SBar.SetText(1, g_FileName.ToChar());
	SBar.SendMsg(SB_SETTIPTEXT, 1, (LPARAM)g_FileName.ToChar());	//ToolTipをつける
	return TRUE;
}

bool ICONVIEWER::OnBmpsave() {

	int n = ListView_GetNextItem(GetDlgItem(m_hWnd, IDC_LISTVIEW), -1,
								LVNI_ALL | LVIS_SELECTED);
	if(n == -1) {	//未選択なら何もしない
		MessageBox(m_hWnd, "ビットマップが選択されていません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	else {			//選択されている場合
		char* flt = "ビットマップファイル(*.bmp)\0*.bmp\0\0";
		char* ext = "bmp";
		char* cp = cmndlg.GetFileName(m_hWnd, flt, FALSE, ext);
		if(!cp) {
			MessageBox(m_hWnd, "キャンセルされました", "エラー", MB_OK | MB_ICONERROR);
			return FALSE;
		}
		CBMP bmp(g_Icon.GetColBmp(n));
		bmp.SaveBMP(cp);
	}
 	return TRUE;
}

bool ICONVIEWER::OnExit() {

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

bool ICONVIEWER::OnAdd() {

	char* flt = "ビットマップファイル(*.bmp)\0*.bmp\0\0";
	char* cp = cmndlg.GetFileName(m_hWnd, flt, TRUE);
	if(!cp) {
		MessageBox(m_hWnd, "キャンセルされました", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	int n = g_Icon.GetCount();		//個数は次のビットマップカウンターと同じ
	if(!g_Icon.Add_Bitmap(cp))		//ビットマップを追加する
		return FALSE;
	//ビットマップを表示
	SendItemMsg(IDC_BMPVIEW, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)g_Icon.GetColBmp(n));
	SendItemMsg(IDC_MSKVIEW, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)g_Icon.GetMaskBmp(n));
	//エディットボックスの表示
	ShowIconData(n);
	//リストビューに登録ビットマップ情報を表示
	SetListView();
	return TRUE;
}

bool ICONVIEWER::OnDelete() {

	int n = ListView_GetNextItem(GetDlgItem(m_hWnd, IDC_LISTVIEW), -1,
								LVNI_ALL | LVIS_SELECTED);
	if(n == -1) {
		MessageBox(m_hWnd, "ビットマップが選択されていません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	g_Icon.Del_Bitmap(n);
	//表示消去用のビットマップ
	HDC hDC = GetDC(m_hWnd);
	HBITMAP hNull = CreateCompatibleBitmap(hDC, 32, 32);
	ReleaseDC(m_hWnd, hDC);
	//消去用ビットマップを表示
	SendItemMsg(IDC_BMPVIEW, STM_SETIMAGE, 0, (LPARAM)hNull);
	SendItemMsg(IDC_MSKVIEW, STM_SETIMAGE, 0, (LPARAM)hNull);
	DeleteObject(hNull);
	//エディットボックスの表示
	SendItemMsg(IDC_EDIT, WM_SETTEXT, 0, (LPARAM)0);
	//リストビューに登録ビットマップ情報を表示
	SetListView();
	return TRUE;
}

bool ICONVIEWER::OnDisplay() {

	int n = ListView_GetNextItem(GetDlgItem(m_hWnd, IDC_LISTVIEW), -1,
								LVNI_ALL | LVIS_SELECTED);
	if(n== -1) {
		MessageBox(m_hWnd, "ビットマップが選択されていません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	//ビットマップを表示
	SendItemMsg(IDC_BMPVIEW, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)g_Icon.GetColBmp(n));
	SendItemMsg(IDC_MSKVIEW, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)g_Icon.GetMaskBmp(n));
	//エディットボックスの表示
	ShowIconData(n);
 	return TRUE;
}

bool ICONVIEWER::OnHelp() {

	CSTR cmd = "hh \"";
	cmd = cmd + g_HelpFile + "\"";
	WinExec(cmd.ToChar(), SW_SHOWNORMAL);
	return TRUE;
}

bool ICONVIEWER::OnVersion() {

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

///////////////////
//ユーザー定義関数
///////////////////
bool ICONVIEWER::SetListView() {

	//リストビューへのデータ登録
	HWND hLV = GetDlgItem(m_hWnd, IDC_LISTVIEW);
	SendMessage(hLV, LVM_DELETEALLITEMS, 0, 0);	//リストビューの全データ抹消
	int IconNum = g_Icon.GetCount();
	LPICONDIRENTRY lpIde;
	PBITMAPINFOHEADER pBmi;
	LV_ITEM item;
	CSTR str;
	for(int i = 0; i < IconNum; i++) {
		//ICONDIRENTRYの情報を取得する
		g_Icon.GetIDEntry(i, &lpIde);
		//リスト先頭列の設定（幅）
		item.mask = LVIF_TEXT;
		str = lpIde->bWidth;
		item.pszText = str.ToChar();
		item.iItem = i;
		item.iSubItem = 0;
		SendMessage(hLV, LVM_INSERTITEM, 0, (LPARAM)&item);
		//第２列の設定（高さ）
		str = lpIde->bHeight;
		item.pszText = str.ToChar();
		item.iSubItem = 1;
		SendMessage(hLV, LVM_SETITEM, 0, (LPARAM)&item);
		//第３列の設定（色数）0=256色
		str = lpIde->bColorCount;
		item.pszText = str.ToChar();
		item.iSubItem = 2;
		SendMessage(hLV, LVM_SETITEM, 0, (LPARAM)&item);
		//第４列の設定（色数）BitCount
		str = lpIde->wBitCount;
		item.pszText = str.ToChar();
		item.iSubItem = 3;
		SendMessage(hLV, LVM_SETITEM, 0, (LPARAM)&item);
		//第５列の設定（画像データ部の大きさ）
		str = lpIde->dwBytesInRes;
		item.pszText = str.ToChar();
		item.iSubItem = 4;
		SendMessage(hLV, LVM_SETITEM, 0, (LPARAM)&item);
		//第６列の設定（ファイル先頭から画像データまでのオフセット）
		str = lpIde->dwImageOffset;
		item.pszText = str.ToChar();
		item.iSubItem = 5;
		SendMessage(hLV, LVM_SETITEM, 0, (LPARAM)&item);
		//BITMAPINFOHEADERの情報を取得する
		g_Icon.GetBmpInfo(i, &pBmi);
		//第７列の設定（画像の幅）
		str = pBmi->biWidth;
		item.pszText = str.ToChar();
		item.iSubItem = 6;
		SendMessage(hLV, LVM_SETITEM, 0, (LPARAM)&item);
		//第８列の設定（画像の高さ×2 の値）
		str = pBmi->biHeight;
		item.pszText = str.ToChar();
		item.iSubItem = 7;
		SendMessage(hLV, LVM_SETITEM, 0, (LPARAM)&item);
		//第９列の設定（プレーンの数）
		str = pBmi->biPlanes;
		item.pszText = str.ToChar();
		item.iSubItem = 8;
		SendMessage(hLV, LVM_SETITEM, 0, (LPARAM)&item);
		//第10列の設定（ピクセル当りの色数・1, 4, 8(, 16), 24(, 32)のいずれか）
		str = pBmi->biBitCount;
		item.pszText = str.ToChar();
		item.iSubItem = 9;
		SendMessage(hLV, LVM_SETITEM, 0, (LPARAM)&item);
		//第11列の設定（表示データ部とマスクデータ部の合計サイズ）
		str = pBmi->biSizeImage;
		item.pszText = str.ToChar();
		item.iSubItem = 10;
		SendMessage(hLV, LVM_SETITEM, 0, (LPARAM)&item);
	}
}

bool ICONVIEWER::ShowIconData(int i) {

	PBITMAPINFOHEADER Bmi;
	LPICONDIRENTRY IDE;
	g_Icon.GetBmpInfo(i, &Bmi);
	g_Icon.GetIDEntry(i, &IDE);
	CSTR IconInfo = "【ICONDIR】		： 6bytes\r\n";
	//アイコン基本情報の表示
	if(g_ImageType == IMAGE_ICON)
		IconInfo = IconInfo + "ファイル種類		： ICON\r\n";
	else if(g_ImageType == IMAGE_CURSOR)
		IconInfo = IconInfo + "ファイル種類		： CURSOR\r\n";
	else
		return FALSE;
	IconInfo = IconInfo + "画像数			： ";
	IconInfo = IconInfo + g_Icon.GetCount();
	IconInfo = IconInfo + "\r\n";
	IconInfo = IconInfo + "【ICONDIRENTRY】		： 16bytes\r\n";
	IconInfo = IconInfo + "イメージ幅			： ";
	IconInfo = IconInfo + IDE->bWidth;
	IconInfo = IconInfo + "\r\n";
	IconInfo = IconInfo + "イメージ高			： ";
	IconInfo = IconInfo + IDE->bHeight;
	IconInfo = IconInfo + "\r\n";
	IconInfo = IconInfo + "色数			： ";
	IconInfo = IconInfo + IDE->bColorCount;
	IconInfo = IconInfo + " (wBitCount = ";
	IconInfo = IconInfo + IDE->wBitCount;
	IconInfo = IconInfo + ")\r\n";
	IconInfo = IconInfo + "ファイル先頭からのオフセット	： ";
	IconInfo = IconInfo + IDE->dwImageOffset;
	IconInfo = IconInfo + "\r\n";
	IconInfo = IconInfo + "画像データ部サイズ (Bytes)	： ";
	IconInfo = IconInfo + IDE->dwBytesInRes;
	IconInfo = IconInfo + "\r\n";
	IconInfo = IconInfo + "【BIMAPINFOHEADER】	： 40bytes\r\n";
	IconInfo = IconInfo + "１画素当たりのビット数		： ";
	IconInfo = IconInfo + Bmi->biBitCount;
	IconInfo = IconInfo + "\r\n";
	IconInfo = IconInfo + "(ＲＧＢＱＵＡＤテーブル)	： ";
	if(Bmi->biBitCount > 8)
		IconInfo = IconInfo + "0";
	else
		IconInfo = IconInfo + 4 * (1 << Bmi->biBitCount);
	IconInfo = IconInfo	 + "bytes (4 x 2 ^";
	IconInfo = IconInfo + Bmi->biBitCount;
	IconInfo = IconInfo	 + ")\r\n";
	IconInfo = IconInfo + "(カラービット hbmColor)	： ";
	IconInfo = IconInfo + ((Bmi->biBitCount * Bmi->biWidth + 31) / 32) * 4 * abs(Bmi->biHeight / 2);
	IconInfo = IconInfo + "bytes\r\n";
	IconInfo = IconInfo + "(マスクビット hbmMask)	： ";
	IconInfo = IconInfo + ((Bmi->biWidth + 31) / 32) * 4 * abs(Bmi->biHeight / 2);
	IconInfo = IconInfo + "bytes\r\n";

	IconInfo = IconInfo + "合計イメージサイズ		： ";
	IconInfo = IconInfo + Bmi->biSizeImage;
	IconInfo = IconInfo + "bytes\r\n";
	//マスクビットのイメージをプリント
	IconInfo = IconInfo + "---------- マスクビットイメージ ----------\r\n";
	IconInfo = IconInfo + "No 01234567 01234567 01234567 01234567\r\n";
	IconInfo = IconInfo + "--------------------------------------\r\n";
	int j, k, l;
	char Dat[4];
	if(Bmi->biHeight > 0) {	//ボトムアップ
		for(j = 31; j >= 0; j--) {
			wsprintf(Dat, "%02d ", j);
			IconInfo = IconInfo + Dat;
			for(k = 0; k < 4; k++) {
				for(l = 0; l < 8; l++) {
					if(g_Icon.m_AND[i][j * 4 + k] & (1 << (7 - l)))
						IconInfo = IconInfo + "1";
					else
						IconInfo = IconInfo + "0";
				}
				IconInfo = IconInfo + " ";
			}
			IconInfo = IconInfo + "\r\n";
		}
	}
	else {					//トップダウン
		for(j = 0; j < 32; j++) {
			wsprintf(Dat, "%02d", j);
			IconInfo = IconInfo + Dat;
			for(k = 0; k < 4; k++) {
				for(l = 0; l < 8; l++) {
					if(g_Icon.m_AND[i][j * 4 + k] & (1 << (7 - l)))
						IconInfo = IconInfo + "1";
					else
						IconInfo = IconInfo + "0";
				}
				IconInfo = IconInfo + " ";
			}
			IconInfo = IconInfo + "\r\n";
		}
	}
	return SendItemMsg(IDC_EDIT, WM_SETTEXT, 0, (LPARAM)IconInfo.ToChar());
}

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

	//ラジオボックスとホットスポットエディットボックスの初期設定
	switch(g_ImageType) {
	case IMAGE_ICON:	//アイコン
		SendItemMsg(IDC_RBICON, BM_SETCHECK, BST_CHECKED, 0);
		break;
	case IMAGE_CURSOR:	//カーソル
		SendItemMsg(IDC_RBCUR, BM_SETCHECK, BST_CHECKED, 0);
		break;
	}
	return TRUE;
}

bool SAVEDLG::OnIdok() {

	if(SendItemMsg(IDC_RBICON, BM_GETCHECK, 0, 0) == BST_CHECKED)
		g_ImageType = IMAGE_ICON;
	else
		g_ImageType = IMAGE_CURSOR;
	EndModal(TRUE);
	return TRUE;
}

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

	//入力文字を3文字に制限する
	SendItemMsg(IDC_HOTSPOTX, EM_SETLIMITTEXT, 2, 0);
	SendItemMsg(IDC_HOTSPOTY, EM_SETLIMITTEXT, 2, 0);
	char num[3];
	wsprintf(num, "%d", g_Icon.GetHsX(g_Num));
	SendItemMsg(IDC_HOTSPOTX, WM_SETTEXT, 0, (LPARAM)num);
	wsprintf(num, "%d", g_Icon.GetHsY(g_Num));
	SendItemMsg(IDC_HOTSPOTY, WM_SETTEXT, 0, (LPARAM)num);
	return TRUE;
}

bool HOTSPOTDLG::OnIdok() {

	int n;
	char num[3];
	SendItemMsg(IDC_HOTSPOTX, WM_GETTEXT, 3, (LPARAM)num);
	n = atoi(num);
	if(n < 0 || n > 32) {
		MessageBox(m_hWnd, "異常値（負または32超）になっています", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	else
		g_Icon.SetHsX(g_Num, n);
	SendItemMsg(IDC_HOTSPOTY, WM_GETTEXT, 3, (LPARAM)num);
	n = atoi(num);
	if(n < 0 || n > 32) {
		 MessageBox(m_hWnd, "異常値（負または32超）になっています", "エラー", MB_OK | MB_ICONERROR);
		 return FALSE;
	}
	else
		g_Icon.SetHsY(g_Num, n);
	EndModal(TRUE);
	return TRUE;
}

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

	EndModal(TRUE);
	return TRUE;
}
