//////////////////////////////////////////
// Album.h
// Copyright (c) 02/28/2022 by BCCSkelton
//////////////////////////////////////////
//BCCSkeltonのヘッダー−これに必要なヘッダーが入っている
#include	"BCCSkelton.h"
//リソースIDのヘッダー
#include	"ResAlbum.h"
//CALBUMのヘッダー
#include	"CALBUM.h"
//遷移用スライダーコントロール関連
#include	"CSLIDER.h"
#define		IDC_SLIDER	1000
//最小ウィンドウ幅、高さ初期値
#define		MINW	480	//サムネイルのLARGEよりも大きくなければならない
#define		MINH	360	//サムネイルのLARGE + 50(ツールバーとステータスバーの高さ)よりも大きくなければならない
//サムネイルの幅、高さ
#define		SMALL	128
#define		LARGE	256
//最大コメント長さ
#define		MAXCMT	1024
//FileList.dllの静的ロード
#include	"DLL.h"
#pragma comment(lib, ".\\Debug\\FileList.lib") 
IMPORT char* GetFileList(char*, char*, char*, char*);
//Resizer.dllの静的ロード
#pragma comment(lib, ".\\Debug\\Resizer.lib") 
IMPORT int ResizeImages();
//IMM関係のヘッダーとライブラリー
#include	<imm.h>
#pragma comment(lib, "imm32.lib") 
//アルバムファイルフィルター
#define		FILEFLT	"アルバムファイル(*.alb)\0*.alb\0\0"

/////////////////////////////////////////////////////////////////////
//CMyWndクラスをCSDIクラスから派生させ、メッセージ用の関数を宣言する
/////////////////////////////////////////////////////////////////////
class CMyWnd : public CSDI
{
public:	//以下はコールバック関数マクロと関連している
	//２重起動防止用のMutex用ID名称
	CMyWnd(char* UName) : CSDI(UName) {}
	//メニュー項目関連
	bool OnNew();
	bool OnOpen();
	bool OnSave();
	bool OnSaveas();
	bool OnExit();
	bool OnAdd();
	bool OnDel();
	bool OnThumnail();
	bool OnPrevious();
	bool OnNext();
	bool OnLarge();
	bool OnSmall();
	bool OnNorm();
	bool OnOrigin();
	bool OnAdjust();
	bool OnRotate0();
	bool OnRotate90();
	bool OnRotate180();
	bool OnRotate270();
	bool OnResize();
	bool OnEdit();
	bool OnDetail();
	bool OnGather();
	bool OnResizer();
	bool OnHelp();
	bool OnVersion();
	//ウィンドウメッセージ関連
	bool OnCreate(WPARAM, LPARAM);
	bool OnLButtonDown(WPARAM, LPARAM);
	bool OnRButtonDown(WPARAM, LPARAM);
	bool OnNotify(WPARAM, LPARAM);
	bool OnSize(WPARAM, LPARAM);
	bool OnPaint(WPARAM, LPARAM);
	bool OnClose(WPARAM, LPARAM);
	bool OnDropFiles(WPARAM, LPARAM);
	bool OnMinMax(WPARAM, LPARAM);
	//ユーザー定義関数
	bool ReadAlbum();			//*.albファイルを読む
	bool ShowAlbum(bool);		//アルバムを表示する
	void ChangeState(bool);		//保存メニュー切替
	void ChangeMode(bool);		//表示メニュー切替
	void ChangeRotateFlip(int);	//回転、反転メニュー切替
	void ShowAsIs();			//単一イメージ原寸表示
	void ShowAdjusted();		//単一イメージサイズ調整表示
};

////////////////////////////////////////////////////////////////////////
//派生させたCMyWndクラスのインスタンスとコールバック関数(マクロ）の作成
//主ウィンドウはダイアログと違い、コールバック関数は一つしか作れない
////////////////////////////////////////////////////////////////////////
CMyWnd Album("Album");	//ウィンドウクラスインスタンスの生成

BEGIN_SDIMSG(Album)	//ダイアログと違い、コールバック関数名を特定しない
	//メニュー項目、ダイアログコントロール関連
	ON_COMMAND(Album, IDM_NEW, OnNew())
	ON_COMMAND(Album, IDM_OPEN, OnOpen())
	ON_COMMAND(Album, IDM_SAVE, OnSave())
	ON_COMMAND(Album, IDM_SAVEAS, OnSaveas())
	ON_COMMAND(Album, IDM_EXIT, OnExit())
	ON_COMMAND(Album, IDM_ADD, OnAdd())
	ON_COMMAND(Album, IDM_DEL, OnDel())
	ON_COMMAND(Album, IDM_THUMNAIL, OnThumnail())
	ON_COMMAND(Album, IDM_PREV, OnPrevious())
	ON_COMMAND(Album, IDM_NEXT, OnNext())
	ON_COMMAND(Album, IDM_LARGE, OnLarge())
	ON_COMMAND(Album, IDM_SMALL, OnSmall())
	ON_COMMAND(Album, IDM_NORM, OnNorm())
	ON_COMMAND(Album, IDM_ORIG, OnOrigin())
	ON_COMMAND(Album, IDM_ADJT, OnAdjust())
	ON_COMMAND(Album, IDM_0, OnRotate0())
	ON_COMMAND(Album, IDM_90, OnRotate90())
	ON_COMMAND(Album, IDM_180, OnRotate180())
	ON_COMMAND(Album, IDM_270, OnRotate270())
	ON_COMMAND(Album, IDM_RESIZE, OnResize())
	ON_COMMAND(Album, IDM_EDIT, OnEdit())
	ON_COMMAND(Album, IDM_DETAIL, OnDetail())
	ON_COMMAND(Album, IDM_GATHER, OnGather())
	ON_COMMAND(Album, IDM_RESIZER, OnResizer())
	ON_COMMAND(Album, IDM_HELP, OnHelp())
	ON_COMMAND(Album, IDM_VERSION, OnVersion())
	//ウィンドウメッセージ関連
	ON_CREATE(Album)
	ON_LBUTTONDOWN(Album)
	ON_RBUTTONDOWN(Album)
	ON_NOTIFY(Album)
	ON_SIZE(Album)
	ON_PAINT(Album)
	ON_CLOSE(Album)
	ON_(Album, WM_DROPFILES, OnDropFiles(wParam, lParam))
	ON_(Album, WM_GETMINMAXINFO, OnMinMax(wParam, lParam))
END_WNDMSG

///////////////////
//ツールバーの作成
///////////////////
CTBAR TBar;

///////////////////////
//ステータスバーの作成
///////////////////////
CSBAR SBar;

//////////////////////
//CALBUMのインスタンス
//////////////////////
CALBUM g_Album;

//////////////////////////////
//遷移用スライダーコントロール
//////////////////////////////
CSLIDER g_Slider;

/////////////////////
//CARGのインスタンス
/////////////////////
CARG g_Arg;

//////////////////////
//CMNDLGのインスタンス
//////////////////////
CMNDLG g_Cmndlg;

//////////////////////
//CEXTCHKのインスタンス
//////////////////////
CEXTCHK g_ExtChk;

///////////////////////////////////////////
// CDLGクラスからRESIZEDLGクラスを派生
// 複数の同一ダイアログ変数とダイアログも作
// れるが、一つのダイアログに一つの派生ダイ
// アログクラスを作成するのが基本
///////////////////////////////////////////
class RESIZEDLG : public CDLG {
public:
	//メンバー変数
	Image* m_pImage = 0;				//Imageクラスポインター
	int m_ImgW;							//イメージの幅
	int m_ImgH;							//イメージの高さ
	char m_NewName[MAX_PATH] = {0};		//セーブ用のファイル名
	WCHAR m_WName[MAX_PATH] = {0};		//ワイド文字ファイル名
	WCHAR m_Encoder[12] = {0};			//エンコーダー型名
	HWND m_hSlider = 0;					//スライダーコントロールのハンドル
	//メンバー関数
	bool OnInit(WPARAM, LPARAM);
	bool OnHScroll(WPARAM, LPARAM);
	bool OnIdok();
	bool OnIdcancel();
	//ユーザー定義関数
	int GetEncoderClsid(const WCHAR*, CLSID*);
};

////////////////////////////////////////////////////////////////////////////
// RESIZEDLGクラスダイアログ変数の生成とそのコールバック関数（マクロ）を定義
// 複数同一クラスのダイアログを作成することを予期してコールバック関数を明記
////////////////////////////////////////////////////////////////////////////
RESIZEDLG resizedlg;

BEGIN_MODALDLGMSG(resizedlgProc, resizedlg)	//第1引数がコールバック関数の名前
	ON_COMMAND(resizedlg, IDOK, OnIdok())
	ON_COMMAND(resizedlg, IDCANCEL, OnIdcancel())
	ON_HSCROLL(resizedlg)
END_DLGMSG

///////////////////////////////////////////
// CDLGクラスからEDITDLGクラスを派生
// 複数の同一ダイアログ変数とダイアログも作
// れるが、一つのダイアログに一つの派生ダイ
// アログクラスを作成するのが基本
///////////////////////////////////////////
class EDITDLG : public CDLG {
public:
	//メンバー変数
	int m_Width;		//ダイアログクライアントエリア幅
	int m_Height;		//ダイアログクライアントエリア高さ
	HIMC m_hImc;		//IMEコンテキストハンドル
	//メンバー関数
	bool OnInit(WPARAM, LPARAM);
	bool OnSize(WPARAM, LPARAM);
	bool OnMinMax(WPARAM, LPARAM);
	bool OnIdok();
	bool OnIdcancel();
};

////////////////////////////////////////////////////////////////////////////
// EDITDLGクラスダイアログ変数の生成とそのコールバック関数（マクロ）を定義
// 複数同一クラスのダイアログを作成することを予期してコールバック関数を明記
////////////////////////////////////////////////////////////////////////////
EDITDLG editdlg;

BEGIN_MODALDLGMSG(editdlgProc, editdlg)	//第1引数がコールバック関数の名前
	ON_COMMAND(editdlg, IDOK, OnIdok())
	ON_COMMAND(editdlg, IDCANCEL, OnIdcancel())
	ON_SIZE(editdlg)
	ON_(editdlg, WM_GETMINMAXINFO, OnMinMax(wParam, lParam))
END_DLGMSG

///////////////////////////////////////////
// CDLGクラスからVERSIONDLGクラスを派生
// 複数の同一ダイアログ変数とダイアログも作
// れるが、一つのダイアログに一つの派生ダイ
// アログクラスを作成するのが基本
///////////////////////////////////////////
class VERSIONDLG : public CDLG {
public:
	bool OnIdok();
};

////////////////////////////////////////////////////////////////////////////
// VERSIONDLGクラスダイアログ変数の生成とそのコールバック関数（マクロ）を定義
// 複数同一クラスのダイアログを作成することを予期してコールバック関数を明記
////////////////////////////////////////////////////////////////////////////
VERSIONDLG versiondlg;

BEGIN_MODALDLGMSG(versiondlgProc, versiondlg)	//第1引数がコールバック関数の名前
	ON_COMMAND(versiondlg, IDOK, OnIdok())
END_DLGMSG
