//////////////////////////////////////////
// AlbumProc.h
// Copyright (c) 02/28/2022 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(m_hInstance, MAKEINTRESOURCE(IDI_TOOLBAR), 13);
	//ツールバーボタン追加
	TBBUTTON tbb[18];
	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].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].fsState = TBSTATE_ENABLED;
	tbb[6].fsStyle = TBSTYLE_BUTTON;
	tbb[6].idCommand = IDM_ADD;
	tbb[7].iBitmap = TBar.m_id + 5;
	tbb[7].fsStyle = TBSTYLE_BUTTON;
	tbb[7].idCommand = IDM_DEL;
	tbb[8].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[9].iBitmap = TBar.m_id + 6;
	tbb[9].fsState = TBSTATE_CHECKED;	//TBSTATE_ENABLED;
	tbb[9].fsStyle = TBSTYLE_BUTTON;
	tbb[9].idCommand = IDM_THUMNAIL;
	tbb[10].iBitmap = TBar.m_id + 7;
	tbb[10].fsStyle = TBSTYLE_BUTTON;
	tbb[10].idCommand = IDM_PREV;
	tbb[11].iBitmap = TBar.m_id + 8;
	tbb[11].fsStyle = TBSTYLE_BUTTON;
	tbb[11].idCommand = IDM_NEXT;
	tbb[12].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[13].iBitmap = TBar.m_id + 9;
	tbb[13].fsState = TBSTATE_ENABLED;
	tbb[13].fsStyle = TBSTYLE_BUTTON;
	tbb[13].idCommand = IDM_NORM;
	tbb[14].iBitmap = TBar.m_id + 10;
	tbb[14].fsStyle = TBSTYLE_BUTTON;
	tbb[14].idCommand = IDM_EDIT;
	tbb[15].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[16].iBitmap = TBar.m_id + 11;
	tbb[16].fsState = TBSTATE_ENABLED;
	tbb[16].fsStyle = TBSTYLE_BUTTON;
	tbb[16].idCommand = IDM_HELP;
	tbb[17].iBitmap = TBar.m_id + 12;
	tbb[17].fsState = TBSTATE_ENABLED;
	tbb[17].fsStyle = TBSTYLE_BUTTON;
	tbb[17].idCommand = IDM_VERSION;
	TBar.AddButtons(18, 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, "Album Version 1.0");
	SBar.SetText(1, "回転表示状態");
	SBar.SetText(2, "アルバムファイル(*.alb)名");

	//CALBUMインスタンスの初期化
	g_Album.Init(m_hWnd);

	//再生用スライダーコントロールの作成
	g_Slider.Create(TBar.GetHandle(), IDC_SLIDER, 340, 0, 300, 24);
	ShowWindow(g_Slider.GetHandle(), SW_HIDE);	//最初はスライダーを隠しておく
	//スライダーの親であるツールバーのWM_HSCROLL処理を行う為のサブクラス化
	g_TBProc = (WNDPROC)GetWindowLongPtr(GetDlgItem(m_hWnd, TOOLBAR), GWLP_WNDPROC);
	SetWindowLongPtr(GetDlgItem(m_hWnd, TOOLBAR), GWLP_WNDPROC, (LONG_PTR)TOOLBARProc);
	g_Slider.SetRange(0, g_Album.m_NoI);	//スライダーの範囲を0〜イメージ数に設定
	g_Slider.SetTic(1);						//スライダーメモリ設定

	//AlbumHelpへのパス設定
	g_Help = g_Arg.Path();
	g_Help = g_Help + "\\AlbumHelp.chm";

	//AlbumListへのパス設定とディレクトリーの作成
	g_Path = g_Arg.Path();
	g_Path = g_Path + "\\AlbumList";
	CreateDirectory(g_Path.ToChar(), NULL);

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

	/////////////////////////////////////////////////////////////
	//OnCreateでファイル起動対応を行おうとすると、OnSize前なので
	//g_Album.m_Widthとm_Heightが未だ0（ゼロ）のままとなり、
	//ShowAlbum関数のところで"Division by zero"エラーとなる。
	//この為ファイル起動はg_ByFileフラグを立ててOnSizeに置く。
	//また、何を投入ファイルについては、
	//(1) *.albは専用フォールダー、パスを設けて集約しており、
	//(2) PCに散在するイメージファイルを対象にした。
	/////////////////////////////////////////////////////////////

	return TRUE;
}

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

	if(!g_ShowMode) {	//サムネイル表示モードなら
		//マウスクリック時のx, y座標を取得する
		int x = GET_X_LPARAM(lParam);
		int y = GET_Y_LPARAM(lParam);
		//マウス座標から写真番号を算出して選択する
		g_Album.Select(g_Album.GetWhichThumb(g_ThumbSize, x, y));
		//画面を消去
		g_Album.SetCol(255, 255, 255, 255);	//Alph = 255、白色で
		g_Album.Cls();						//画面クリアー
		//サムネイル上の選択写真枠設定色とペン
		g_Album.SetCol(128, 255, 64, 64);
		g_Album.SetPen(8);
		//サムネイルで現在の選択写真のあるページを表示
		g_Album.ShowThumbnail(g_ThumbSize);
	}
	return TRUE;
}

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

	if(g_Album.GetCount()) {
		HMENU hMenu;
		if(g_ShowMode) {	//単一表示の場合
			hMenu = GetSubMenu(GetSubMenu(GetMenu(m_hWnd), 2), 1);
		}
		else {				//サムネイル表示の場合
			hMenu = GetSubMenu(GetSubMenu(GetMenu(m_hWnd), 2), 0);
		}
		//ウインドウの位置情報を取得
		RECT rec;
		GetWindowRect(m_hWnd, &rec);
		//ポップアップメニューの表示
		POINT pt;
		GetCursorPos(&pt);
		TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_LEFTBUTTON,
			pt.x, pt.y, 0, m_hWnd, &rec);
		return TRUE;
	}
	else
		return FALSE;
}

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

	//ツールバーツールチップ
	if(((LPNMHDR)lParam)->code == TTN_NEEDTEXT) {	//TTN_GETDISPINFOと同じ
		((LPTOOLTIPTEXT)lParam)->hinst = m_hInstance;
		char* tag;
		switch(((LPTOOLTIPTEXT)lParam)->hdr.idFrom) {
		case IDM_NEW:
			tag = "アルバムの作成、編集";
			break;
		case IDM_OPEN:
			tag = "アルバムを開く";
			break;
		case IDM_SAVE:
			tag = "アルバムの保存";
			break;
		case IDM_EXIT:
			tag = "終了";
			break;
		case IDM_ADD:
			tag = "写真の追加";
			break;
		case IDM_DEL:
			tag = "写真の削除";
			break;
		case IDM_THUMNAIL:
			tag = "サムネイル表示";
			break;
		case IDM_PREV:
			tag = "前へ";
			break;
		case IDM_NEXT:
			tag = "次へ";
			break;
		case IDM_NORM:
			tag = "標準表示";
			break;
		case IDM_EDIT:
			tag = "写真の裏書編集";
			break;
		case IDM_HELP:
			tag = "Albumについて";
			break;
		case IDM_VERSION:
			tag = "バージョン情報";
			break;
		}
		((LPTOOLTIPTEXT)lParam)->lpszText = tag;
		return TRUE;
	}
	return FALSE;
}

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

	TBar.AutoSize();
	SBar.AutoSize();
	g_Slider.AutoSize(1, 0, 0);	//右上角に離さずに表示
	//メインウィンドウの有効クライアントエリアを取得
	g_Album.GetSize(lParam, TBar.GetHandle(), SBar.GetHandle());
	//ファイル起動対応（g_ByFileが真の時、1回のみ）
	if(g_ByFile) {
		for(int i = 1; i < g_Arg.c(); i++) {
			if(g_ExtChk.CheckExt(g_Arg.v(i), IMGFILTER))	//対象ファイルか否かチェック
				g_Album.Add(g_Arg.v(i));					//Image配列への追加
			else
				MessageBox(m_hWnd, g_Arg.v(i), "再生対象外のファイル", MB_OK | MB_ICONERROR);
		}
		//アルバムの表示（新しいアルバム）
		ShowAlbum(TRUE);
		g_ByFile = FALSE;
	}
	return TRUE;
}

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

	PAINTSTRUCT paint;
	//仮想ウィンドウをウィンドウへ張り付ける
	g_Album.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;
}

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

	//ドラッグアンドドロップされたファイル名取得と処理
	static char FileName[MAX_PATH];
	int n;									//ファイル数
	HDROP hDrop = (HDROP)wParam; 			//HDROPを取得
	n = DragQueryFile(hDrop, -1, NULL, 0);	//ファイル数を取得
	for(int i = 0; i < n; i++) {
		DragQueryFile(hDrop, i, FileName, MAX_PATH);	//ファイル名を取得
		if(g_ExtChk.CheckExt(FileName, IMGFILTER)) {	//対象ファイルか否かチェック
			g_Album.Add(FileName);	//Image配列への追加
		}
		else
			MessageBox(m_hWnd, FileName, "再生対象外のファイル", MB_OK | MB_ICONERROR);
	}
	//ドラッグアンドドロップの終了
	DragFinish((HDROP)wParam);
	//アルバムの表示（写真の追加）
	ShowAlbum(FALSE);
	return TRUE;
}

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

	//典型的なウィンドウのサイズ制限処理
	MINMAXINFO *pmmi;
	pmmi = (MINMAXINFO*)lParam;
	pmmi->ptMinTrackSize.x = MINW + 16;	//クライアントエリア + 16
	pmmi->ptMinTrackSize.y = MINH + 61;	//クライアントエリア + 61
	return FALSE;							//処理はDefWndProcに任す
}

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

	//ファイルリストダイアログで*.albファイルを作成、編集
	char* cp = GetFileList("アルバムファイル(*.alb)\0*.alb\0\0",
							IMGFILTER, g_Path.ToChar(), "alb");
	//作成できたなら一旦保存してOnOpenで読み込む
	if(*cp) {
		g_FileName = cp;
		//アルバムファイルを読む
		ReadAlbum();
		//アルバムの表示（新しいアルバム）
		ShowAlbum(TRUE);
		return TRUE;
	}
	else {
		MessageBox(m_hWnd, "キャンセルされました", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
}

bool CMyWnd::OnOpen() {

	//「ファイルを開く」ダイアログを使う
	char* cp = g_Cmndlg.GetFileName(m_hWnd, FILEFLT, TRUE, "alb", g_Path.ToChar());
	if(cp) {
		g_FileName = cp;	//ファイルを開くダイアログでファイルを選択
		//アルバムファイルを読む
		ReadAlbum();
		//アルバムの表示（新しいアルバム）
		ShowAlbum(TRUE);
		return TRUE;
	}
	else {
		MessageBox(m_hWnd, "キャンセルされました", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
}

bool CMyWnd::OnSave() {

	//現在のファイル名が無ければ「名前を付けて保存」へ移行
	if(!*g_FileName.ToChar())
		return OnSaveas();
	//現在のファイル名で保存
	else {
		//現在の選択ファイルを保存
		int sel = g_Album.GetSelected();
		//g_Fileにファイルデータを入れ、保存する
		g_File = "";
		for(int i = 0; i < g_Album.GetCount(); i++) {
			g_Album.Select(i);
			g_File = g_File + "\"";
			g_File = g_File + g_Album.GetFileName();
			g_File = g_File + "\",\"";
			g_File = g_File + g_Album.GetComment();
			g_File = g_File + "\"\n";
		}
		g_File.ToFile(g_FileName.ToChar());
		//現在の選択ファイルに戻す
		g_Album.Select(sel);
	}
	return TRUE;
}

bool CMyWnd::OnSaveas() {

	//「ファイルを保存」ダイアログでパス、ファイル名を指定
	char* cp = g_Cmndlg.GetFileName(m_hWnd, FILEFLT, FALSE, "alb", g_Path.ToChar());
	if(cp)
		g_FileName = cp;	//ファイルを保存ダイアログでファイルを選択
	else {
		MessageBox(m_hWnd, "キャンセルされました", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	//現在の選択ファイルを保存
	int sel = g_Album.GetSelected();
	//g_Fileにファイルデータを入れ、保存する
	g_File = "";
	for(int i = 0; i < g_Album.GetCount(); i++) {
		g_Album.Select(i);
		g_File = g_File + "\"";
		g_File = g_File + g_Album.GetFileName();
		g_File = g_File + "\",\"";
		g_File = g_File + g_Album.GetComment();
		g_File = g_File + "\"\n";
	}
	g_File.ToFile(g_FileName.ToChar());
	//現在の選択ファイルに戻す
	g_Album.Select(sel);
	//読み込んだアルバムファイル名をステータスバーに表示
	SBar.SetText(2, g_FileName.ToChar());
	return TRUE;
}

bool CMyWnd::OnExit() {

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

bool CMyWnd::OnAdd() {

	//「ファイルを開く」ダイアログで選択、追加
	if(!g_Album.Add("")) {
		MessageBox(m_hWnd, "写真を追加できませんでした", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	//スライダーの範囲を0〜イメージ数 - 1に設定
	g_Slider.SetRange(0, g_Album.GetCount() - 1);
	//スライダーの位置をイメージ数 - 1に設定
	g_Slider.SetPosition(g_Album.GetCount() - 1);
	//アルバムに追加された写真を選択
	g_Album.Select(g_Album.GetCount() - 1);
	//画面を消去
	g_Album.SetCol(255, 255, 255, 255);	//Alph = 255、白色で
	g_Album.Cls();						//画面クリアー
	if(g_ShowMode) {	//単一表示の場合
		//画面中央にサイズ調整して表示
		g_Album.ShowImg(FALSE, FALSE);
	}
	else {				//サムネイル表示の場合
		//サムネイル上の選択写真枠設定色とペン
		g_Album.SetCol(128, 255, 64, 64);
		g_Album.SetPen(8);
		//サムネイルで現在の選択写真のあるページを表示
		g_Album.ShowThumbnail(g_ThumbSize);
	}
	//メニュー、ボタンを初期状態から変える
	ChangeState(TRUE);
	return TRUE;
}

bool CMyWnd::OnDel() {

	//最終確認
	if(MessageBox(m_hWnd, "選択された写真をアルバムから削除しますか？", "確認",
					MB_YESNO | MB_ICONQUESTION) == IDNO) {
		return FALSE;
	}
	g_Album.Delete(g_Album.GetSelected());
	//写真があればスライダーの範囲を0〜イメージ数 - 1に設定
	int n = g_Album.GetCount();
	if(n)
		g_Slider.SetRange(0, n - 1);
	else
		g_Slider.SetRange(0, 0);
	g_Slider.SetPosition(g_Album.GetSelected());
	//画面を消去
	g_Album.SetCol(255, 255, 255, 255);	//Alph = 255、白色で
	g_Album.Cls();						//画面クリアー
	if(g_ShowMode) {	//単一表示の場合
		//現在の選択写真を中央にサイズ調整して表示
		g_Album.ShowImg(FALSE, FALSE);
	}
	else {				//サムネイル表示の場合
		//サムネイル上の選択写真枠設定色とペン
		g_Album.SetCol(128, 255, 64, 64);
		g_Album.SetPen(8);
		//サムネイルで現在の選択写真のあるページを表示
		g_Album.ShowThumbnail(g_ThumbSize);
	}
	//写真がなくなったらメニュー、ボタンを初期状態にする
	if(!n)
		ChangeState(FALSE);
	return TRUE;
}

bool CMyWnd::OnThumnail() {

	//表示モードを変更
	g_ShowMode = FALSE;
	//メニューチェックを変更し、ツールバーボタンを表示
	ChangeMode(g_ShowMode);
	//スライダーを隠す
	ShowWindow(g_Slider.GetHandle(), SW_HIDE);
	if(g_Album.GetCount()) {
		//画面を消去
		g_Album.SetCol(255, 255, 255, 255);	//Alph = 255、白色で
		g_Album.Cls();						//画面クリアー
		//サムネイル上の選択写真枠設定色とペン
		g_Album.SetCol(128, 255, 64, 64);
		g_Album.SetPen(8);
		//サムネイルで現在の選択写真のあるページを表示
		g_Album.ShowThumbnail(g_ThumbSize);
		return TRUE;
	}
	else {
		MessageBox(m_hWnd, "写真がありません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
}

bool CMyWnd::OnPrevious() {

	if(!g_Album.GetCount()) {
		MessageBox(m_hWnd, "写真がありません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	//現在位置の取得
	int pos = g_Album.GetSelected();
	//最終位置の取得
	int max = g_Album.GetCount() - 1;
	//メニューとボタンの状態変更
	HMENU hMenu = GetSubMenu(GetMenu(m_hWnd), 2);	//メニューハンドルの取得
	if(!pos) {				//先頭にいるなら「前へ」を無効にして戻る
		//メニュー
		EnableMenuItem(hMenu, IDM_PREV, MF_BYCOMMAND | MF_GRAYED);
		//ツールバーボタン
		SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_PREV, MAKELONG(0, 0));
		//警告音
		MessageBeep(MB_ICONHAND);
		return TRUE;
	}
	else if(pos == max){	//末尾にいるなら「次へ」を有効にする
		//メニュー
		EnableMenuItem(hMenu, IDM_NEXT, MF_BYCOMMAND | MF_ENABLED);
		//ツールバーボタン
		SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_NEXT, MAKELONG(TBSTATE_ENABLED, 0));
	}
	//表示変更
	if(g_ShowMode) {	//単一表示の場合
		//写真を一つ戻す
		g_Album.Select(pos - 1);
		//画面を消去
		g_Album.SetCol(255, 255, 255, 255);	//Alph = 255、白色で
		g_Album.Cls();						//画面クリアー
		//画面中央サイズ調整で表示
		g_Album.ShowImg(FALSE, FALSE);
		//スライダーを一つ戻す
		g_Slider.SetPosition(g_Slider.GetPosition() - 1);
	}
	else {				//サムネイル表示の場合
		//選択写真を1ページ分戻す（1ページ分なければ先頭写真を選択）
		g_Album.Select(pos - g_Album.HowManyThumb(g_ThumbSize));
		//画面を消去
		g_Album.SetCol(255, 255, 255, 255);	//Alph = 255、白色で
		g_Album.Cls();						//画面クリアー
		//サムネイル上の選択写真枠設定色とペン
		g_Album.SetCol(128, 255, 64, 64);
		g_Album.SetPen(8);
		//サムネイルで現在のページのひとつ前を表示
		g_Album.ShowThumbnail(g_ThumbSize);
	}
	return TRUE;
}

bool CMyWnd::OnNext() {

	if(!g_Album.GetCount()) {
		MessageBox(m_hWnd, "写真がありません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	//現在位置の取得
	int pos = g_Album.GetSelected();
	//最終位置の取得
	int max = g_Album.GetCount() - 1;
	//メニューとボタンの状態変更
	HMENU hMenu = GetSubMenu(GetMenu(m_hWnd), 2);	//メニューハンドルの取得
	if(pos == max) {	//末尾にいるなら「次へ」を無効にして戻る
		//メニュー
		EnableMenuItem(hMenu, IDM_NEXT, MF_BYCOMMAND | MF_GRAYED);
		//ツールバーボタン
		SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_NEXT, MAKELONG(0, 0));
		//警告音
		MessageBeep(MB_ICONHAND);
		return TRUE;
	}
	else if(!pos) {		//先頭にいるなら「前へ」を有効にする
		//メニュー
		EnableMenuItem(hMenu, IDM_PREV, MF_BYCOMMAND | MF_ENABLED);
		//ツールバーボタン
		SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_PREV, MAKELONG(TBSTATE_ENABLED, 0));
	}
	//表示変更
	if(g_ShowMode) {	//単一表示の場合
		//写真を一つ進める
		g_Album.Select(pos + 1);
		//画面を消去
		g_Album.SetCol(255, 255, 255, 255);	//Alph = 255、白色で
		g_Album.Cls();						//画面クリアー
		//画面中央サイズ調整で表示
		g_Album.ShowImg(FALSE, FALSE);
		//スライダーを一つ進める
		g_Slider.SetPosition(g_Slider.GetPosition() + 1);
	}
	else {				//サムネイル表示の場合
		//選択写真を1ページ分進める（1ページ分なければ最終写真を選択）
		g_Album.Select(pos + g_Album.HowManyThumb(g_ThumbSize));
		//画面を消去
		g_Album.SetCol(255, 255, 255, 255);	//Alph = 255、白色で
		g_Album.Cls();						//画面クリアー
		//サムネイル上の選択写真枠設定色とペン
		g_Album.SetCol(128, 255, 64, 64);
		g_Album.SetPen(8);
		//サムネイルで現在の選択のページの次を表示
		g_Album.ShowThumbnail(g_ThumbSize);
	}
	return TRUE;
}

bool CMyWnd::OnLarge() {

	g_ThumbSize = LARGE;
	if(g_Album.GetCount()) {
		//画面を消去
		g_Album.SetCol(255, 255, 255, 255);	//Alph = 255、白色で
		g_Album.Cls();						//画面クリアー
		//サムネイル上の選択写真枠設定色とペン
		g_Album.SetCol(128, 255, 64, 64);
		g_Album.SetPen(8);
		//サムネイルで選択写真を含むページを表示
		g_Album.ShowThumbnail(g_ThumbSize);
		return TRUE;
	}
	else {
		MessageBox(m_hWnd, "写真がありません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
}

bool CMyWnd::OnSmall() {

	g_ThumbSize = SMALL;
	if(g_Album.GetCount()) {
		//画面を消去
		g_Album.SetCol(255, 255, 255, 255);	//Alph = 255、白色で
		g_Album.Cls();						//画面クリアー
		//サムネイル上の選択写真枠設定色とペン
		g_Album.SetCol(128, 255, 64, 64);
		g_Album.SetPen(8);
		//サムネイルで選択写真を含むページを表示
		g_Album.ShowThumbnail(g_ThumbSize);
		return TRUE;
	}
	else {
		MessageBox(m_hWnd, "写真がありません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
}

bool CMyWnd::OnNorm() {

	//表示モードを変更
	g_ShowMode = TRUE;
	//メニューチェックを変更し、ツールバーボタンを非表示
	ChangeMode(g_ShowMode);
	//スライダーを現在選択されている写真で表示する
	ShowWindow(g_Slider.GetHandle(), SW_SHOW);
	g_Slider.SetPosition(g_Album.GetSelected());
	if(!g_Album.GetCount()) {
		MessageBox(m_hWnd, "写真がありません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	else {
		//画面を消去
		g_Album.SetCol(255, 255, 255, 255);	//Alph = 255、白色で
		g_Album.Cls();						//画面クリアー
		//選択写真を画面中央サイズ調整で表示
		g_Album.ShowImg(FALSE, FALSE);
		return TRUE;
	}
}

bool CMyWnd::OnOrigin() {

	if(g_Album.GetCount()) {
		//画面を消去
		g_Album.SetCol(255, 255, 255, 255);	//Alph = 255、白色で
		g_Album.Cls();						//画面クリアー
		//選択写真を左上に原寸で表示
		g_Album.ShowImg(TRUE, TRUE);
		return TRUE;
	}
	else {
		MessageBox(m_hWnd, "写真がありません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
}

bool CMyWnd::OnAdjust() {

	if(g_Album.GetCount()) {
		//画面を消去
		g_Album.SetCol(255, 255, 255, 255);	//Alph = 255、白色で
		g_Album.Cls();						//画面クリアー
		//選択写真を画面中央サイズ調整で表示
		g_Album.ShowImg(FALSE, FALSE);
		return TRUE;
	}
	else {
		MessageBox(m_hWnd, "写真がありません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
}

bool CMyWnd::OnRotate0() {

	if(!g_Album.GetCount()) {
		MessageBox(m_hWnd, "写真がありません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	g_Album.SetRotateFlip(RotateNoneFlipNone);
	OnNorm();
	ChangeRotateFlip(0);
	return TRUE;
}

bool CMyWnd::OnRotate90() {

	if(!g_Album.GetCount()) {
		MessageBox(m_hWnd, "写真がありません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	g_Album.SetRotateFlip(Rotate90FlipNone);
	OnNorm();
	ChangeRotateFlip(1);
	return TRUE;
}

bool CMyWnd::OnRotate180() {

	if(!g_Album.GetCount()) {
		MessageBox(m_hWnd, "写真がありません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	g_Album.SetRotateFlip(Rotate180FlipNone);
	OnNorm();
	ChangeRotateFlip(2);
	return TRUE;
}

bool CMyWnd::OnRotate270() {

	if(!g_Album.GetCount()) {
		MessageBox(m_hWnd, "写真がありません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	g_Album.SetRotateFlip(Rotate270FlipNone);
	OnNorm();
	ChangeRotateFlip(3);
	return TRUE;
}

bool CMyWnd::OnResize() {

	if(g_Album.GetCount()) {
		resizedlg.DoModal(m_hWnd, "IDD_RESIZE", resizedlgProc, m_hInstance);
		return TRUE;
	}
	else {
		MessageBox(m_hWnd, "写真がありません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
}

bool CMyWnd::OnEdit() {

	if(g_Album.GetCount()) {
		//写真の裏書ダイアログを開く
		editdlg.DoModal(m_hWnd, "IDD_EDIT", editdlgProc, m_hInstance);
		return TRUE;
	}
	else {
		MessageBox(m_hWnd, "写真がありません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
}

bool CMyWnd::OnDetail() {

	if(g_Album.GetCount()) {
		//写真のプロパティダイアログを開く
		SHELLEXECUTEINFO ShInfo;
		ZeroMemory(&ShInfo, sizeof(SHELLEXECUTEINFO));
		ShInfo.cbSize	= sizeof(SHELLEXECUTEINFO);
		ShInfo.hwnd		= m_hWnd;
		ShInfo.lpVerb	= "properties";
		ShInfo.lpFile	= g_Album.GetFileName();
		ShInfo.fMask	= SEE_MASK_INVOKEIDLIST;
		ShInfo.nShow	= SW_SHOWNORMAL;
		ShellExecuteEx(&ShInfo);
		return TRUE;
	}
	else {
		MessageBox(m_hWnd, "写真がありません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
}

bool CMyWnd::OnGather() {

	if(!g_Album.GetCount()) {
		MessageBox(m_hWnd, "写真がありません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	//アルバム写真を纏めるフォールダーを取得
	char* cp = g_Cmndlg.GetPath(m_hWnd, "アルバム写真を纏めるフォールダーの指定");
	if(!cp) {
		MessageBox(m_hWnd, "キャンセルされました", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	//ファイルパスを'\'付きで記録
	CSTR path = cp;
	path = path + "\\";
	//fnに纏めフォールダーのパスを代入
	CSTR fn = path;
	//選択写真の記録
	int sel = g_Album.GetSelected();
	//写真数を取得
	int lmt = g_Album.GetCount();
	for(int i = 0; i < lmt; i++) {
		//写真を選択
		g_Album.Select(i);
		//選択写真のフルパスファイル名を取得
		g_Arg = cp = g_Album.GetFileName();
		//fnにファイル名のみ付加
		fn = fn + g_Arg.FileName();
		//ファイルを上書きコピー
		CopyFile(cp, fn.ToChar(), FALSE);
		//fnに纏めフォールダーのパスを代入
		fn = path;
	}
	//選択写真を再選択
	g_Album.Select(sel);
	return TRUE;
}

bool CMyWnd::OnResizer() {

	ResizeImages();
	return TRUE;
}

bool CMyWnd::OnHelp() {

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

bool CMyWnd::OnVersion() {

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

/////////////////////////////////////////////
//ユーザー定義関数
//*.albファイルを読む
//newone: TRUE−先頭、FALSE−m_Selectedの位置
/////////////////////////////////////////////
bool CMyWnd::ReadAlbum() {

	//現在登録された写真がある場合
	if(g_Album.GetCount()) {
		int res = MessageBox(m_hWnd, "現在イメージデータが残っています。\n"\
						"削除しますか？（はい）、追加しますか（いいえ）、"\
						"処理を中止しますか（キャンセル）",
						"削除確認", MB_YESNOCANCEL | MB_ICONQUESTION);
    	switch(res) {
		case IDYES:
			g_Album.DeleteAll();
			break;
		case IDNO:
			break;
		case IDCANCEL:
			return FALSE;
		}
	}
	//g_FileNameのファイルをg_Fileにも見込めたか？
	if(!g_File.FromFile(g_FileName.ToChar())) {	//albファイルを読み込めたか？
		MessageBox(m_hWnd, "albファイルを読み込めませんでした", "エラー",
					MB_OK | MB_ICONERROR);
		g_FileName = "";						//ファイル名データを初期化
		return FALSE;
	}
	//アルバムに写真データ読込
	CSTR fn, cmt;
	while(g_File.Next(fn)) {	//ファイル名の切り出し
		g_File.Next(cmt);		//コメントの切り出し
		if(!g_Album.Add(fn.ToChar(), "", cmt.ToChar())) {	//写真の追加
			MessageBox(m_hWnd, "写真を追加できませんでした", "エラー", MB_OK | MB_ICONERROR);
			g_Album.DeleteAll();//途中まで読み込んだファイルがあれば削除する
			g_Album.SetCol(255, 255, 255, 255);				//Alph = 255、白色で
			g_Album.Cls();									//画面クリアー
			g_File = "";		//一旦読み込んだファイルを廃棄
			g_FileName = "";	//ファイル名データを初期化
			return FALSE;
		}
	}
	return TRUE;
}

bool CMyWnd::ShowAlbum(bool newone) {

	//読み込んだアルバムファイル名をステータスバーに表示
	SBar.SetText(2, g_FileName.ToChar());
	//メニュー、ボタンを初期状態から変える
	ChangeState(TRUE);
	//メニュー、ツールバーボタンの初期状態
	ChangeMode(g_ShowMode);
	//新しいアルバム（newone == TRUE）なら先頭の写真を選択
	if(newone)
		g_Album.Select(0);
	//スライダーを写真の先頭にセットする
	g_Slider.SetRange(0, g_Album.GetCount() - 1);	//スライダーの範囲を0〜イメージ数 - 1に設定
	g_Slider.SetPosition(g_Album.GetSelected());	//現在選択されている写真を選択
	//Alph = 255、白色で画面クリアー
	g_Album.SetCol(255, 255, 255, 255);
	g_Album.Cls();
	//写真の表示
	if(g_ShowMode) {	//単一表示の場合
		ShowWindow(g_Slider.GetHandle(), SW_SHOW);	//スライダーを表示
		g_Album.ShowImg(FALSE, FALSE);				//写真を画面中央にサイズを調整して表示
	}
	else {				//サムネイル表示の場合
		ShowWindow(g_Slider.GetHandle(), SW_HIDE);	//スライダーを非表示
		//サムネイル上の選択写真枠設定色とペン
		g_Album.SetCol(128, 255, 64, 64);
		g_Album.SetPen(8);
		g_Album.ShowThumbnail(g_ThumbSize);
	}
	return TRUE;
}

///////////////////////////////////
//ユーザー定義関数
//保存メニュー切替
//flag: FALSE−写真がなくなった場合
//flag: TRUE−データがある場合
//編集メニュー切替
//flag: FLASE−写真がなくなった場合
//flag: TRUE −写真がある場合
///////////////////////////////////
void CMyWnd::ChangeState(bool flag) {

	//ファイルメニューハンドルの取得
	HMENU hMenu = GetSubMenu(GetMenu(m_hWnd), 0);
	if(flag) {
		//アルバムの保存メニュー
		EnableMenuItem(hMenu, IDM_SAVE, MF_BYCOMMAND | MF_ENABLED);
		EnableMenuItem(hMenu, IDM_SAVEAS, MF_BYCOMMAND | MF_ENABLED);
		//ツールバーボタン
		SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_SAVE, MAKELONG(TBSTATE_ENABLED, 0));
		SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_SAVEAS, MAKELONG(TBSTATE_ENABLED, 0));
	}
	else { 
		//アルバムの保存メニュー
		EnableMenuItem(hMenu, IDM_SAVE, MF_BYCOMMAND | MF_GRAYED);
		EnableMenuItem(hMenu, IDM_SAVEAS, MF_BYCOMMAND | MF_GRAYED);
		//ツールバーボタン
		SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_SAVE, MAKELONG(0, 0));
		SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_SAVEAS, MAKELONG(0, 0));
	}
	//編集メニューハンドルの取得
	hMenu = GetSubMenu(GetMenu(m_hWnd), 1);
	if(flag) {
		//削除メニュー
		EnableMenuItem(hMenu, IDM_DEL, MF_BYCOMMAND | MF_ENABLED);
		//削除ボタン
		SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_DEL, MAKELONG(TBSTATE_ENABLED, 0));
	}
	else { 
		//削除メニュー
		EnableMenuItem(hMenu, IDM_DEL, MF_BYCOMMAND | MF_GRAYED);
		//削除ボタン
		SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_DEL, MAKELONG(0, 0));
	}
	//表示メニューハンドルの取得
	hMenu = GetSubMenu(GetMenu(m_hWnd), 2);
	//前へメニュー
	EnableMenuItem(hMenu, IDM_PREV, MF_BYCOMMAND | (flag ? MF_ENABLED : MF_GRAYED));
	//次へメニュー
	EnableMenuItem(hMenu, IDM_NEXT, MF_BYCOMMAND | (flag ? MF_ENABLED : MF_GRAYED));
	if(flag) {
		//前へボタン
		SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_PREV, MAKELONG(TBSTATE_ENABLED, 0));
		//次へボタン
		SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_NEXT, MAKELONG(TBSTATE_ENABLED, 0));
	}
	else { 
		//前へボタン
		SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_PREV, MAKELONG(0, 0));
		//次へボタン
		SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_NEXT, MAKELONG(0, 0));
	}
}

///////////////////////////////////
//ユーザー定義関数
//表示メニュー切替
//flag: TRUE−標準表示
//FALSE−サムネイル表示
///////////////////////////////////
void CMyWnd::ChangeMode(bool flag) {

	HMENU hMenu = GetSubMenu(GetMenu(m_hWnd), 2);	//表示メニューハンドルの取得
	//メニューバー
	EnableMenuItem(hMenu, 0, MF_BYPOSITION | (flag ? MF_GRAYED : MF_ENABLED));
	EnableMenuItem(hMenu, 1, MF_BYPOSITION | (flag ? MF_ENABLED : MF_GRAYED));
	//メニューアイテム
	MENUITEMINFO mii;
	mii.cbSize = sizeof(mii);
	mii.fMask = MIIM_STATE;
	if(flag) {
		//メニュー
		mii.fState = MFS_CHECKED;
		SetMenuItemInfo(hMenu, 1, TRUE, &mii);
		EnableMenuItem(hMenu, IDM_LARGE, MF_BYCOMMAND | MF_GRAYED);
		EnableMenuItem(hMenu, IDM_SMALL, MF_BYCOMMAND | MF_GRAYED);
		EnableMenuItem(hMenu, IDM_ORIG, MF_BYCOMMAND | MF_ENABLED);
		EnableMenuItem(hMenu, IDM_ADJT, MF_BYCOMMAND | MF_ENABLED);
		EnableMenuItem(hMenu, IDM_EDIT, MF_BYCOMMAND | MF_ENABLED);
		//ツールバーボタン
		SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_NORM, MAKELONG(TBSTATE_PRESSED, 0));
		SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_EDIT, MAKELONG(TBSTATE_ENABLED, 0));
		SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_THUMNAIL, MAKELONG(TBSTATE_ENABLED, 0));
	}
	else { 
		//メニュー
		mii.fState = MFS_CHECKED;
		SetMenuItemInfo(hMenu, 0, TRUE, &mii);
		EnableMenuItem(hMenu, IDM_LARGE, MF_BYCOMMAND | MF_ENABLED);
		EnableMenuItem(hMenu, IDM_SMALL, MF_BYCOMMAND | MF_ENABLED);
		EnableMenuItem(hMenu, IDM_ORIG, MF_BYCOMMAND | MF_GRAYED);
		EnableMenuItem(hMenu, IDM_ADJT, MF_BYCOMMAND | MF_GRAYED);
		EnableMenuItem(hMenu, IDM_EDIT, MF_BYCOMMAND | MF_GRAYED);
		//ツールバーボタン
		SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_NORM, MAKELONG(TBSTATE_ENABLED, 0));
		SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_EDIT, MAKELONG(0, 0));
		SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_THUMNAIL, MAKELONG(TBSTATE_PRESSED, 0));
	}
}

///////////////////////////////////
//ユーザー定義関数
//回転、反転メニュー切替
///////////////////////////////////
void CMyWnd::ChangeRotateFlip(int n) {

	//既にチェックが入っているメニューアイテム
	static int old = 0;
	//表示メニューハンドルの取得
	HMENU hMenu = GetSubMenu(GetSubMenu(GetSubMenu(GetMenu(m_hWnd), 2), 1), 2);
	//メニューアイテム
	MENUITEMINFO mii;
	mii.cbSize = sizeof(mii);
	mii.fMask = MIIM_STATE;
	mii.fState = MFS_ENABLED;
	//既に入っているチェックを外す
	SetMenuItemInfo(hMenu, old, TRUE, &mii);
	//新しくチェックを入れる
	mii.fState = MFS_CHECKED;
	SetMenuItemInfo(hMenu, n, TRUE, &mii);
	//回転、反転状況をステータスバーに表示
	SBar.SetText(1, g_RotateFlip[n]);
	old = n;
}

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

	//作業用文字列変数
	char buff[MAX_PATH];
	//エラーチェック
	if(!g_Album.GetCount) {
		MessageBox(m_hWnd, "写真がありません", "エラー", MB_OK | MB_ICONERROR);
		EndModal(FALSE);
		return TRUE;
	}
	//現在選択されている写真のファイル名の表示
	SendItemMsg(IDC_SOURCE, WM_SETTEXT, 0, (LPARAM)g_Album.GetFileName());
	//画像形式をチェックして表示
	int n = g_ExtChk.CheckExt(g_Album.GetFileName(), IMGFILTER);
	if(!n) {
		MessageBox(m_hWnd, "対象ファイルではありません", "エラー", MB_OK | MB_ICONERROR);
		EndModal(FALSE);
		return TRUE;
	}
	else if(n > 2)
		n -= 1;
	lstrcpyW(m_Encoder, g_EncoderList[n - 1]);	//メンバー変数m_Encoderにエンコーダー名を保存
	wcstombs(buff, g_EncoderList[n - 1], 12);
	SendItemMsg(IDC_IMGTYPE, WM_SETTEXT, 0, (LPARAM)buff);
	//写真のファイル名からイメージインスタンスを生成
	mbstowcs(m_WName, g_Album.GetFileName(), MAX_PATH);
	m_pImage = new Image(m_WName);
	if(!m_pImage) {
		MessageBox(m_hWnd, "写真を読み込めませんでした", "エラー", MB_OK | MB_ICONERROR);
		EndModal(FALSE);
		return TRUE;
	}
	//読み込めたら現在の回転を適用する
	RotateFlipType rft = g_Album.GetRotateFlip();
	m_pImage->RotateFlip(rft);
	n = 0;
	switch(rft) {
	case RotateNoneFlipNone:
		n = 0;
		break;
	case Rotate90FlipNone:
		n = 1;
		break;
	case Rotate180FlipNone:
		n = 2;
		break;
	case Rotate270FlipNone:
		n = 3;
		break;
	}
	SendItemMsg(IDC_ROTATE, WM_SETTEXT, 0, (LPARAM)g_RotateFlip[n]);
	//幅と高さを取得してエディットボックスに代入
	m_ImgW = m_pImage->GetWidth();
	m_ImgH = m_pImage->GetHeight();
	wsprintf(buff, "%d", m_ImgW);
	SendItemMsg(IDC_WIDTH, WM_SETTEXT, 0, (LPARAM)buff);
	wsprintf(buff, "%d", m_ImgH);
	SendItemMsg(IDC_HEIGHT, WM_SETTEXT, 0, (LPARAM)buff);
	//スライダー初期設定−ハンドルの取得
	m_hSlider = GetDlgItem(m_hWnd, IDC_TRACKBAR);
	//20の目盛りを設定
	SendMessage(m_hSlider, TBM_SETTICFREQ, 20, 0);
	//0-100の範囲を設定
	SendMessage(m_hSlider, TBM_SETRANGE, TRUE, (LPARAM)MAKELONG(0, 100));
	//マウスクリックの際の移動量
	SendMessage(m_hSlider, TBM_SETPAGESIZE, 0, (LPARAM)10);
	//矢印キーの際の移動量
	SendMessage(m_hSlider, TBM_SETLINESIZE, 0, (LPARAM)1);
	//スライダーの位置を設定
	SendMessage(m_hSlider, TBM_SETPOS, TRUE, (LPARAM)100);
	//調整幅、高さをエディットボックスに代入
	wsprintf(buff, "%d", m_ImgW);
	SendItemMsg(IDC_ADJW, WM_SETTEXT, 0, (LPARAM)buff);
	wsprintf(buff, "%d", m_ImgH);
	SendItemMsg(IDC_ADJH, WM_SETTEXT, 0, (LPARAM)buff);

	return TRUE;
}

bool RESIZEDLG::OnHScroll(WPARAM wParam, LPARAM lParam) {

	//作業用文字列変数
	char buff[MAX_PATH];
	//スライダー位置
	int pos;
	if(lParam != (LPARAM)m_hSlider)
		return FALSE;					//スライダーからの通知でなければ何もしない
	switch(LOWORD(wParam)) {			//スライダーコントロールからの通知
	case SB_THUMBTRACK:					//スライダーのドラッグ時と
	case SB_THUMBPOSITION:				//摘みを離した時に
		pos = HIWORD(wParam);			//スライダーの位置を取得
		break;
	default:							//それ以外の場合HIWORD(wParam)は使えない
		pos = SendMessage(m_hSlider, TBM_GETPOS, 0, 0);	//TBM_GETPOSで位置を取得
		break;
	}
	int w = m_ImgW * pos / 100;
	int h = m_ImgH * pos / 100;
	wsprintf(buff, "%d", w);
	SendItemMsg(IDC_ADJW, WM_SETTEXT, 0, (LPARAM)buff);
	wsprintf(buff, "%d", h);
	SendItemMsg(IDC_ADJH, WM_SETTEXT, 0, (LPARAM)buff);
	return TRUE;
}

bool RESIZEDLG::OnIdok() {

	//処理の意向確認
	int res = MessageBox(m_hWnd, "ファイルを上書きしますか（はい）、"\
						"別名保存しますか（いいえ）、処理を中止しますか（キャンセル）？",
						"確認", MB_YESNOCANCEL | MB_ICONQUESTION);
	if(res == IDCANCEL) {
		//m_pImageのメモリーを解放
		delete m_pImage;
		EndModal(FALSE);
		return TRUE;
	}
	else if(res == IDNO) {
		//「ファイルを保存」ダイアログでパス、ファイル名を指定
		char* cp = g_Cmndlg.GetFileName(m_hWnd, "全てのファイル\0*.*\0\0", FALSE);
		if(!cp) {
			MessageBox(m_hWnd, "キャンセルされました", "エラー", MB_OK | MB_ICONERROR);
			return FALSE;
		}
			lstrcpy(m_NewName, cp);
	}
	else {	//IDYES
		//上書き用ファイル名（"(Originalファイル名).bak"）を設定
		lstrcpy(m_NewName, g_Album.GetFileName());
		lstrcpy(strstr(m_NewName, "."), ".bak");
	}
	//作業用文字列変数
	char buff[MAX_PATH];
	//縮小修正した幅、高さを取得
	SendItemMsg(IDC_ADJW, WM_GETTEXT, MAX_PATH, (LPARAM)buff);
	int w = atoi(buff);
	SendItemMsg(IDC_ADJH, WM_GETTEXT, MAX_PATH, (LPARAM)buff);
	int h = atoi(buff);
	//縮小画像用のBitmapオブジェクトをオリジナルの縦横比で生成
	Bitmap* pBitmap = new Bitmap(w, h);
	//Bitmapオブジェクトから出力用のGraphicsフレームオブジェクトを作成
	Graphics* pFrame = Graphics::FromImage(pBitmap);
	//Rectオブジェクトのフレームの矩形を生成
	Gdiplus::Rect rtFrame(0, 0, w, h);
	//画像の全体をフレームのrtFrameで表した矩形領域へ描画
	pFrame->DrawImage (m_pImage, rtFrame, 0, 0, m_ImgW, m_ImgH, UnitPixel);	//1ポイント == 1/72インチ
	// エンコーダのCLSIDを取得
	CLSID encoderClsid;
	if(GetEncoderClsid(m_Encoder, &encoderClsid) == -1) {	//m_Encoderに保存してあるエンコーダー型
		MessageBoxW(m_hWnd, m_WName, L"エンコーダーCLSIDの取得に失敗しました", MB_OK | MB_ICONERROR);
		//ビットマップのメモリーを解放
		delete pBitmap;
		//m_pImageのメモリーを解放
		delete m_pImage;
		EndModal(FALSE);
		return TRUE;
	}
	//EncoderParameters配列の第1オブジェクトを使って品質を指定
	LONG lQuality = 100;	//品質レベルは100の最高品質
	//EncoderParameters配列オブジェクト
	EncoderParameters EncoderParams;
	//先頭のEncoderParameterオブジェクト
	EncoderParams.Parameter[0].Guid = EncoderQuality;					//品質であることを指定
	EncoderParams.Parameter[0].NumberOfValues = 1;						//Valueの変数数は1つ
	EncoderParams.Parameter[0].Type = EncoderParameterValueTypeLong;	//Valueの変数の長さ
	EncoderParams.Parameter[0].Value = (VOID*) &lQuality;				//品質指定
	EncoderParams.Count = 1;											//EncoderParameters配列は一つだけ
	//フレームとして使ったBitmapを指定エンコーダー、品質でファイルに保存
	mbstowcs(m_WName, m_NewName, MAX_PATH);
	pBitmap->Save(m_WName, &encoderClsid, &EncoderParams);
	//ビットマップのメモリーを解放
	delete pBitmap;
	//m_pImageのメモリーを解放
	delete m_pImage;
	//上書き処理
	if(res == IDYES) {
		DeleteFile(g_Album.GetFileName());			//オリジナルファイルを削除
		MoveFile(m_NewName, g_Album.GetFileName());	//縮小ファイルをオリジナル名に変更
	}
	EndModal(TRUE);
	return TRUE;
}

bool RESIZEDLG::OnIdcancel() {

	//m_pImageのメモリーを解放
	delete m_pImage;
	EndModal(FALSE);
	return TRUE;
}

////////////////////////////////////////////////////
//ユーザー定義関数
//Image CODEC CLSIDの取得（出典：Microsoft Doc）
//formatに合致するCODECのCLSIDアドレスをpClsidに渡す
//戻り値：成功−Image CODEC配列(ImageCodecInfo)引数
//　　　　失敗− -1
////////////////////////////////////////////////////
int RESIZEDLG::GetEncoderClsid(const WCHAR* format, CLSID* pClsid) {

	//イメージCODECの数、サイズ取得
	UINT  num = 0;		//image encoderの数
	UINT  size = 0;		//image encoder配列のサイズ（バイト数）
	GetImageEncodersSize(&num, &size);
	if(size == 0) {
		return -1; //イメージCODECサイズ取得失敗
	}
	//イメージCODEC情報用クラス(ImageCodecInfo)
	ImageCodecInfo* pImageCodecInfo = NULL;
	pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
	if(pImageCodecInfo == NULL) {
		return -1; //メモリ確保失敗
	}
	//イメージCODEC情報クラス取得
	GetImageEncoders(num, size, pImageCodecInfo);
	for(UINT j = 0; j < num; ++j) {
		//formatがCODECのMIME(Multipurpose Internet Mail Extensions)型なら
		if(wcscmp(pImageCodecInfo[j].MimeType, format) == 0) {
			//J番目のCODECのグローバル一意識別子（CLSID）を渡す
			*pClsid = pImageCodecInfo[j].Clsid;
			free(pImageCodecInfo);
			return j;	//成功
		}  
	}
	free(pImageCodecInfo);
	return -1;			// 失敗 - 要求した種類のエンコーダが存在しなかった
}

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

	//クライアントエリアサイズを記録
	RECT rec;
	GetClientRect(m_hWnd, &rec);
	m_Width = rec.right - rec.left;
	m_Height = rec.bottom - rec.top;
	//IDC_EDITコントロールを展開する（初期状態で0x7FFF−32,767字迄取り扱い可能）
	MoveWindow(GetDlgItem(m_hWnd, IDC_EDIT), 2, 2, m_Width - 4, m_Height - 36, TRUE);
	//コメントを読み込む
	SendItemMsg(IDC_EDIT, WM_SETTEXT, 0, (LPARAM)g_Album.GetComment());
	//IMEの変換状態を全角ひらがなにセットする
	m_hImc = ImmGetContext(GetDlgItem(m_hWnd, IDC_EDIT));
	ImmSetOpenStatus(m_hImc, TRUE);
	if(!ImmSetConversionStatus(m_hImc, IME_CMODE_NATIVE | IME_CMODE_FULLSHAPE, IME_SMODE_PHRASEPREDICT))
		MessageBox(m_hWnd, "全角ひらがな連文節変換入力にセットできませんでした", "エラー", MB_OK | MB_ICONERROR);
	return TRUE;
}

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

	//コントロールの位置、サイズ変更
	RECT rec;	//矩形取得用
	POINT pt;	//スクリーン座標変換用
	int w, h;	//幅、高さ計算用
	int diffx = LOWORD(lParam) - m_Width;	//前回と今回の差分
	int diffy = HIWORD(lParam) - m_Height;	//前回と今回の差分
	m_Width = LOWORD(lParam);				//今回の幅
	m_Height = HIWORD(lParam);				//今回の高さ
	//幅高さ変更−IDC_EDIT
	GetWindowRect(GetDlgItem(m_hWnd, IDC_EDIT), &rec);	//ウィンドウ位置取得
	w = rec.right - rec.left;
	h = rec.bottom - rec.top;
	pt.x = rec.left;
	pt.y = rec.top;
	ScreenToClient(m_hWnd, &pt);
	MoveWindow(GetDlgItem(m_hWnd, IDC_EDIT), pt.x, pt.y, w + diffx, h + diffy, TRUE);
	//左右上下移動−IDOK
	GetWindowRect(GetDlgItem(m_hWnd, IDOK), &rec);	//ウィンドウ位置取得
	w = rec.right - rec.left;
	h = rec.bottom - rec.top;
	pt.x = rec.left;
	pt.y = rec.top;
	ScreenToClient(m_hWnd, &pt);
	MoveWindow(GetDlgItem(m_hWnd, IDOK), pt.x + diffx, pt.y + diffy, w, h, TRUE);
	//クライアントエリアを再描画
	InvalidateRect(m_hWnd, NULL, TRUE);
	return TRUE;
}

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

	//典型的なウィンドウのサイズ制限処理
	MINMAXINFO *pmmi;
	pmmi = (MINMAXINFO*)lParam;
	pmmi->ptMinTrackSize.x = 320;	//クライアントエリア + 16
	pmmi->ptMinTrackSize.y = 240;	//クライアントエリア + 61
	return FALSE;					//処理はDefWndProcに任す
}

bool EDITDLG::OnIdok() {

	//IMEを閉じる
	ImmSetOpenStatus(m_hImc, FALSE);
	ImmReleaseContext(GetDlgItem(m_hWnd, IDC_EDIT), m_hImc);
	//IDC_EDITコントロールの文字列を取得する（初期状態で0x7FFF−32,767字迄取り扱い可能）
	char buff[MAXCMT];
	//コメントを読み込む
	SendItemMsg(IDC_EDIT, WM_GETTEXT, MAXCMT, (LPARAM)buff);
	g_Album.SetComment(buff);
	EndModal(TRUE);
	return TRUE;
}

bool EDITDLG::OnIdcancel() {

	EndModal(FALSE);
	return TRUE;
}

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

	EndModal(TRUE);
	return TRUE;
}
