// Setting.cpp : インプリメンテーション ファイル
//

#include "stdafx.h"
#include "shitarabianLogic.h"
#include "Setting.h"
#include "ShitarabianLogicImp.h"
#include "DocumentIF.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define MATRIXNUM		( 40 )				//マトリックスの数
#define PREVIEWSIZE		( 150 )				//プレビューの幅

/////////////////////////////////////////////////////////////////////////////
// CSetting ダイアログ


CSetting::CSetting(CWnd* pParent /*=NULL*/)
	: CDialog(CSetting::IDD, pParent)
{
	//{{AFX_DATA_INIT(CSetting)
	m_bEnable = FALSE;
	m_iMatrixNumY = 0;
	m_iMatrixNumX = 0;
	m_strPreviewX = _T("");
	m_strPreviewY = _T("");
	//}}AFX_DATA_INIT
}


void CSetting::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSetting)
	DDX_Control(pDX, IDC_PREVIEW, m_PreView);
	DDX_Control(pDX, IDC_SLIDERY, m_ctrSliderY);
	DDX_Control(pDX, IDC_SLIDERX, m_ctrSliderX);
	DDX_Check(pDX, IDC_ENABLE, m_bEnable);
	DDX_Slider(pDX, IDC_SLIDERY, m_iMatrixNumY);
	DDX_Slider(pDX, IDC_SLIDERX, m_iMatrixNumX);
	DDX_Text(pDX, IDC_STATICX, m_strPreviewX);
	DDX_Text(pDX, IDC_STATICY, m_strPreviewY);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CSetting, CDialog)
	//{{AFX_MSG_MAP(CSetting)
	ON_BN_CLICKED(IDC_OK, OnOk)
	ON_WM_SHOWWINDOW()
	ON_BN_CLICKED(IDC_BMPOPEN, OnBmpopen)
	ON_WM_PAINT()
	ON_BN_CLICKED(IDC_EXPORT, OnExport)
	ON_WM_HSCROLL()
	ON_WM_VSCROLL()
	ON_BN_CLICKED(IDC_CANCEL, OnCancel)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSetting メッセージ ハンドラ

void CSetting::OnOk() 
{
	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
	UpdateData( TRUE );
	CDialog::OnOK();
}

void CSetting::OnCancel() 
{
	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
	CDialog::OnCancel();
}

void CSetting::OnShowWindow(BOOL bShow, UINT nStatus) 
{
	CDialog::OnShowWindow(bShow, nStatus);
	UpdateData( FALSE );
}

BOOL CSetting::OnInitDialog() 
{
	CDialog::OnInitDialog();
	// TODO: この位置に初期化の補足処理を追加してください
	m_pBitmap = NULL;

	//スライダーXの設定
	m_ctrSliderX.SetRangeMin( 0 , FALSE );
	m_ctrSliderX.SetRangeMax( MATRIXNUM , FALSE );
	m_ctrSliderX.SetPos( MATRIXNUM / 2 );
	m_ctrSliderX.SetTicFreq( MATRIXNUM / 4 );

	//スライダーYの設定
	m_ctrSliderY.SetRangeMin( 0 , FALSE );
	m_ctrSliderY.SetRangeMax( MATRIXNUM , FALSE );
	m_ctrSliderY.SetPos( MATRIXNUM / 2 );
	m_ctrSliderY.SetTicFreq( MATRIXNUM / 4 );

	UpdateData( TRUE );

	//スライダーの数字
	m_strPreviewX.Format( "X : %d" , m_iMatrixNumX );
	m_strPreviewY.Format( "Y : %d" , m_iMatrixNumY );

	//プレビュー表示位置測定
	CPoint ptFrame( 0,0 );
	m_PreView.ClientToScreen( &ptFrame );
	CPoint ptDialog( 0,0 );
	ClientToScreen( &ptDialog );
	m_iPrevPosX	= ptFrame.x - ptDialog.x;
	m_iPrevPosY = ptFrame.y - ptDialog.y;
	
	//プレビューのリージョン作成
	m_rectPreview.left		= m_iPrevPosX;
	m_rectPreview.top		= m_iPrevPosY;
	m_rectPreview.right		= m_iPrevPosX + PREVIEWSIZE;
	m_rectPreview.bottom	= m_iPrevPosY + PREVIEWSIZE;

	//出力ボタンの使用状態
	GetDlgItem( IDC_EXPORT )->EnableWindow( FALSE );

	UpdateData( FALSE );
	return TRUE;  // コントロールにフォーカスを設定しないとき、戻り値は TRUE となります
	              // 例外: OCX プロパティ ページの戻り値は FALSE となります
}

//参照ボタン
void CSetting::OnBmpopen() 
{
	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
	CFileDialog fd(
		TRUE,									//ファイルを開く
		"bmp",									//拡張子
		"*.bmp",								//ファイルの名前（初期表記の名前）
		OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
		"ビットマップ",							//ファイルの種類
		NULL );

	if ( fd.DoModal() == IDOK )
	{
		m_strFilePassName = fd.GetPathName();	//ファイルパス取得
		
		//ビットマップを取り込んでおく
		HBITMAP		hBitmap;

		hBitmap = ( HBITMAP ) ::LoadImage(
			NULL,
			m_strFilePassName,
			IMAGE_BITMAP,
			0,0,
			LR_LOADFROMFILE | LR_MONOCHROME
			);

		m_pBitmap = CBitmap::FromHandle( hBitmap );

		DrawPreview();
		GetDlgItem( IDC_EXPORT )->EnableWindow( TRUE );
	}
}

//ファイルからダイアログに表示
void CSetting::DrawPreview()
{
	UpdateData( TRUE );
	if ( m_pBitmap == NULL )
	{
		return;
	}	
	//プレビュー大きさ
	int iPreViewWidth	= GetPreviewSize( m_iMatrixNumX );
	int iPreViewHeight	= GetPreviewSize( m_iMatrixNumY );

	CClientDC	dcDlg( this );
	CDC			dcPreview;
	CDC			dcMatrix;
	CBitmap		bmpMatrix;

	bmpMatrix.CreateCompatibleBitmap(
		&dcDlg,
		m_iMatrixNumX,
		m_iMatrixNumY
		);
	
	m_pBitmap->GetBitmap( &m_tBitmap );

	dcPreview.CreateCompatibleDC( &dcDlg );
	dcMatrix.CreateCompatibleDC( &dcPreview );

	dcMatrix.SelectObject( &bmpMatrix );
	dcPreview.SelectObject( m_pBitmap );

	dcMatrix.StretchBlt(
		0,0,
		m_iMatrixNumX,m_iMatrixNumY,
		&dcPreview,
		0,0,
		m_tBitmap.bmWidth,m_tBitmap.bmHeight,
		SRCCOPY
		);

	dcDlg.StretchBlt(
		m_iPrevPosX			,m_iPrevPosY,
		iPreViewWidth		,iPreViewHeight,
		&dcMatrix,
		0					,0,
		m_iMatrixNumX		,m_iMatrixNumY,
		SRCCOPY
		);

	dcPreview.DeleteDC();
	dcMatrix.DeleteDC();
}

void CSetting::OnPaint() 
{
	CPaintDC dc(this); // 描画用のデバイス コンテキスト
	
	// TODO: この位置にメッセージ ハンドラ用のコードを追加してください
	DrawPreview();
	// 描画用メッセージとして CDialog::OnPaint() を呼び出してはいけません
}

//出力ボタン
void CSetting::OnExport() 
{
	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
	UpdateData( TRUE );

	CClientDC	dcDlg( this );
	CDC			dcTemp;
	CDC			dcMatrix;
	CBitmap		bmpMatrix;

	bmpMatrix.CreateCompatibleBitmap(
		&dcDlg,
		m_iMatrixNumX,
		m_iMatrixNumY
		);
	
	m_pBitmap->GetBitmap( &m_tBitmap );

	dcTemp.CreateCompatibleDC( &dcDlg );
	dcMatrix.CreateCompatibleDC( &dcTemp );

	dcMatrix.SelectObject( &bmpMatrix );
	dcTemp.SelectObject( m_pBitmap );

	dcMatrix.StretchBlt(
		0,0,
		m_iMatrixNumX,m_iMatrixNumY,
		&dcTemp,
		0,0,
		m_tBitmap.bmWidth,m_tBitmap.bmHeight,
		SRCCOPY
		);

	CString strMatrix;
	strMatrix.Empty();

	int iPixelX = 0;
	int iPixelY = 0;

	while ( iPixelY < m_iMatrixNumY )
	{
		iPixelX = 0;

		while ( iPixelX < m_iMatrixNumX )
		{
			if ( dcMatrix.GetPixel( iPixelX , iPixelY ) == RGB( 0,0,0 ) )
			{
				strMatrix += "■";
			}
			else
			{
				strMatrix += "□";
			}
			iPixelX++;
		}
		strMatrix += 0x0D;
		strMatrix += 0x0A;
		iPixelY++;
	}	
	dcMatrix.DeleteDC();
	pDocIF->Insert( strMatrix );
	pDocIF->ReDraw();
}

void CSetting::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
	CDC* dcTemp;
	dcTemp = GetDC();
	dcTemp->FillSolidRect( &m_rectPreview , GetSysColor( COLOR_3DFACE ) );
	DrawPreview();

	m_strPreviewX.Format( "X : %d" , m_iMatrixNumX );
	UpdateData( FALSE );

	CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

void CSetting::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
	CDC* dcTemp;
	dcTemp = GetDC();
	dcTemp->FillSolidRect( &m_rectPreview , GetSysColor( COLOR_3DFACE ) );
	DrawPreview();

	m_strPreviewY.Format( "Y : %d" , m_iMatrixNumY );
	UpdateData( FALSE );

	CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}

int CSetting::GetPreviewSize( double iMatrixNum )
{
	int		iPreviewSize = 0;
	double	dPreviewSize = 0;

	dPreviewSize = ( iMatrixNum / MATRIXNUM ) * PREVIEWSIZE;

	iPreviewSize = ( int ) dPreviewSize;

	return iPreviewSize;
}
