/*

  sizedlg.h
  Copyright(C) 2007,2008 INASOFT 矢吹拓也/Ayacy

  サイズ可変ダイアログ機能提供ライブラリsizedlg.libを利用するためのヘッダファイル
  (クラスライブラリ)

*/

#ifndef MYLIB__ISSIZEDLGCLASS__
#define MYLIB__ISSIZEDLGCLASS__

#ifndef OWN__SIZEDLG__
#pragma comment(lib, "sizedlg.lib")
#endif /* OWN__SIZEDLG__ */

#ifdef __cplusplus

// ダイアログ内のコントロールのアンカー情報を与える引数のための構造体
// 最終要素は iCtrl = 0 としておくこと
typedef struct {
	int			  iCtrl;		// ダイアログ中のアイテムのID
	unsigned char anchor;		// アンカー(上下左右の固定位置)
} DLGITEM;

#define ANCHOR_TOPLEFT		0	// コントロールはダイアログの左上に張り付く
#define ANCHOR_TOPRIGHT		1	// コントロールはダイアログの右上に張り付く
#define ANCHOR_BOTTOMLEFT	2	// コントロールはダイアログの左下に張り付く
#define ANCHOR_BOTTOMRIGHT	3	// コントロールはダイアログの右下に張り付く
#define ANCHOR_TOPLEFTRIGHT	4	// コントロールはダイアログの左右上に張り付く
#define ANCHOR_CENTER		5	// コントロールはダイアログの左右上下に張り付く
#define ANCHOR_BOTTOMLEFTRIGHT	6	// コントロールはダイアログの左右下に張り付く
#define ANCHOR_END			255	// 番兵


// クラス内部で使う、コントロール情報格納用構造体
typedef struct {
	HWND hItem;					// ダイアログ中のアイテムのハンドル
	int  dx;					// 横座標の距離保持変数
	int  dy;					// 縦座標の距離保持変数
	int  dx2;					// 横座標の距離保持変数(2)
	int  dy2;					// 縦座標の距離保持変数(2)
	unsigned char anchor;		// アンカー（上下左右の固定位置）
} DLGITEMDATA;

// リサイズ用ダイアログのためのクラス
class SIZEDLG {

private:
	HWND				hDlg;			// ダイアログのハンドル
	DLGITEMDATA	       *dlgitemdata;	// ダイアログの各種アイテムの情報
	int                 minwidth;		// リサイズ時の最小の幅
	int                 minheight;      // リサイズ時の最小の高さ
	int                 maxwidth;		// リサイズ時の最大の幅
	int                 maxheight;      // リサイズ時の最大の高さ
	int					defwidth;		// ダイアログ生成時の幅
	int					defheight;		// ダイアログ生成時の高さ

public:
	SIZEDLG() :										// コンストラクタ
	  hDlg(NULL), dlgitemdata(NULL), defwidth(0), defheight(0), minwidth(0), minheight(0), maxwidth(0), maxheight(0) {}
	SIZEDLG(HWND hWnd, const DLGITEM *dlgitems) :	// コンストラクタ+Create()
	  hDlg(NULL), dlgitemdata(NULL), defwidth(0), defheight(0), minwidth(0), minheight(0), maxwidth(0), maxheight(0)
	  {Create(hWnd, dlgitems);}
	~SIZEDLG();										// デストラクタ
	bool Create(HWND hWnd, const DLGITEM *dlgitems);	// ダイアログハンドルと構造体情報を与える
	bool Resize(bool bRedraw);						// WM_SIZEメッセージで呼び出す
	BOOL GetMinMaxInfo(LPARAM lParam);				// WM_GETMINMAXINFOメッセージで呼び出す

	bool Add(HWND hItem, unsigned char anchor);		// 要素の追加
	bool Add(HWND hWnd, int iItem, unsigned char anchor); // 要素の追加

	inline void SetMinMaxInfo(int minwidth, int minheight, 
		               int maxwidth, int maxheight) // ウィンドウの最大・最小サイズを設定(-1で値を未定にする)
		{this->minwidth = minwidth; this->maxwidth = maxwidth; this->minheight = minheight; this->maxheight = maxheight;}

	inline int GetDefWidth()						// ダイアログ生成時の幅を得る
		{return defwidth;}

	inline int GetDefHeight()						// ダイアログ生成時の高さを得る
		{return defheight;}
};

#endif /* __cplusplus */

#endif /* MYLIB__ISSIZEDLGCLASS__ */
