
// clippingImageMFCDlg.cpp : 実装ファイル
//

#include "stdafx.h"
#include "clippingImageMFC.h"
#include "clippingImageMFCDlg.h"
#include "afxdialogex.h"
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
CBrush inverseBrush(RGB(255,255,255));
CRect pictBoxRect(180,70,530,420);
CPen pen(PS_DASH,1,RGB(255,255,255));
#define BOTTOMOFFSET 30
#define RIGHTOFFSET 20
bool flg = false;//起動時にイベントが発生してサイズを変えると落ちるため、回避のためのフラグ
// アプリケーションのバージョン情報に使われる CAboutDlg ダイアログ
bool beginXFocus =false;
bool beginYFocus =false;
bool endXFocus =false;
bool endYFocus =false;
bool textFocus=false;

int maxrepeat=10000;

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// ダイアログ データ
	enum { IDD = IDD_ABOUTBOX };

	protected:
//	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV サポート

// 実装
protected:
	DECLARE_MESSAGE_MAP()
public:
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CclippingImageMFCDlg ダイアログ
CclippingImageMFCDlg::CclippingImageMFCDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CclippingImageMFCDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CclippingImageMFCDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_SELECTEDFILE2, filePathTextBox);
	DDX_Control(pDX, IDC_CURRENTPOSITION, currentPositionText);
	//DDX_Control(pDX, IDC_BEGINX, beginXtext);
	//DDX_Control(pDX, IDC_BEGINY, beginYtext);
	//DDX_Control(pDX, IDC_ENDX, endXtext);
	//DDX_Control(pDX, IDC_ENDY, endYtext);
	DDX_Control(pDX, IDC_PROGRESS,progressText);
	DDX_Control(pDX,IDC_PROGRESSBAR,CProgressCtrl);
	DDX_Control(pDX,IDC_PREFIX,prefixedit);
	DDX_Control(pDX,IDC_MAXNUM,maxnumedit);
	


}
BEGIN_MESSAGE_MAP(CclippingImageMFCDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_FILESELECT2, &CclippingImageMFCDlg::OnBnClickedFileselect2)
	ON_BN_CLICKED(IDC_MAKEFILE, &CclippingImageMFCDlg::OnBnClickedMakeFile)
	ON_WM_MOUSEMOVE()
	ON_WM_SIZE()//onsize
	ON_WM_DESTROY()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_CTLCOLOR()
	ON_EN_CHANGE(IDC_BEGINX, &CclippingImageMFCDlg::OnEnChangeBeginx)
	ON_EN_CHANGE(IDC_BEGINY, &CclippingImageMFCDlg::OnEnChangeBeginy)
	ON_EN_CHANGE(IDC_ENDX, &CclippingImageMFCDlg::OnEnChangeEndx)
	ON_EN_CHANGE(IDC_ENDY, &CclippingImageMFCDlg::OnEnChangeEndy)
	ON_EN_SETFOCUS(IDC_BEGINX, &CclippingImageMFCDlg::OnEnSetfocusBeginx)
	ON_EN_SETFOCUS(IDC_BEGINY, &CclippingImageMFCDlg::OnEnSetfocusBeginy)
	ON_EN_SETFOCUS(IDC_ENDX, &CclippingImageMFCDlg::OnEnSetfocusEndx)
	ON_EN_SETFOCUS(IDC_ENDY, &CclippingImageMFCDlg::OnEnSetfocusEndy)
	ON_EN_CHANGE(IDC_PREFIX, &CclippingImageMFCDlg::OnEnChangePrefix)
	ON_BN_CLICKED(IDC_CSV, &CclippingImageMFCDlg::OnBnClickedCsv)
	ON_BN_CLICKED(IDC_FOLDER, &CclippingImageMFCDlg::OnBnClickedCheck1)
	ON_WM_DROPFILES()
END_MESSAGE_MAP()


// CclippingImageMFCDlg メッセージ ハンドラー

BOOL CclippingImageMFCDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// "バージョン情報..." メニューをシステム メニューに追加します。

	// IDM_ABOUTBOX は、システム コマンドの範囲内になければなりません。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、
	//  Framework は、この設定を自動的に行います。
	SetIcon(m_hIcon, TRUE);			// 大きいアイコンの設定
	SetIcon(m_hIcon, FALSE);		// 小さいアイコンの設定

	// TODO: 初期化をここに追加します。
	
	
	SetDlgItemText(IDC_BEGINX,L"0");
	SetDlgItemText(IDC_BEGINY,L"0");
	SetDlgItemText(IDC_ENDX,L"0");
	SetDlgItemText(IDC_ENDY,L"0");
	prefix=L"mini";
	prefixedit.SetWindowTextW(prefix);
	maxnumedit.SetWindowTextW(L"999");
	sheedFilePath=L"sample-0.bmp";
	sheedfiletitle=L"sample-0";
	SetDlgItemText(IDC_ORIGINALNAME,sheedFilePath);
	SetDlgItemText(IDC_OUTPUTNAME,L"_"+sheedFilePath);
	SetDlgItemText(IDC_FOLDERNAME,L"mini");
	csvcheck=false;
	foldercheck=false;
	
	drawFlag=FALSE;
	this->MoveWindow(0,0,570,500);
	
	aspectRatio=1.0;//初期値
		dib.Open(&sheedFilePath);
		if(dib.IsValid()){
			aspectRatio= (float)dib.getWidth()/(float)dib.getHeight();
			int longer = max(dib.getWidth(),dib.getHeight());
			scalex=(float)dib.getWidth()/(float)pictBoxRect.Width();
			scaley=(float)dib.getHeight()/(float)pictBoxRect.Height();
			//長いほうに合わせて
			//長い方に合わせてアスペクト比を適用
		
			
		}else{
			
		}
	this->GetClientRect(&clientRect);
	//この二つは常にダイアログの下のほうにいること
	progressText.MoveWindow(0,clientRect.bottom-BOTTOMOFFSET,70,20);
	CProgressCtrl.MoveWindow(70,clientRect.bottom-BOTTOMOFFSET,300,20);
	adjustImageSize(clientRect.Width(),clientRect.Height());	
	
	size.cx=1;size.cy=1;	
	wchar_t buf[_MAX_PATH];
	GetCurrentDirectory(_MAX_PATH,buf);
	directory.Format(L"%s",buf);
	maxrepeat=GetDlgItemInt(IDC_MAXNUM);
	CProgressCtrl.SetRange(0,maxrepeat);
	
	flg=true;
	return TRUE;  // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
}

void CclippingImageMFCDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	//if(nID ==SC_RESTORE  ){MessageBox(L"元のサイズに戻した");}
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}
void CclippingImageMFCDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 描画のデバイス コンテキスト

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// クライアントの四角形領域内の中央
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// アイコンの描画
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{		
		
		CClientDC dc(this);
		CDC pictureField;
			CBitmap m_bmp;
			pictureField.CreateCompatibleDC(&dc);
			m_bmp.CreateCompatibleBitmap(&dc,pictBoxRect.Width(),pictBoxRect.Height());//error
			pictureField.SelectObject(&m_bmp);

			dib.Draw(&pictureField,0,0,pictBoxRect.Width(),pictBoxRect.Height());
			
			setRect(&clippingRect,&begin,&end);
		if(clippingRect.Width() >0 && clippingRect.Height() >0){		
			pictureField.DrawEdge(&clippingRect,EDGE_BUMP,BF_RECT);
			}
	
		
		dc.BitBlt(pictBoxRect.left,pictBoxRect.top,pictBoxRect.Width(),pictBoxRect.Height(),//転送先パラメータ
			//転送元パラメータ
			&pictureField,
			0,0,//pictBoxRect.left,pictBoxRect.top,
			SRCCOPY);
			CDialogEx::OnPaint();//これないと周りのボタンが消える
}
}

HCURSOR CclippingImageMFCDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}
void CclippingImageMFCDlg::adjustImageSize(int cwidth,int cheight){
	float dialogaspectratio=(float)cwidth/(float)cheight;	
	if(aspectRatio<=1.0){//縦長の場合 正方形の場合
		if(dialogaspectratio<aspectRatio){
			int height=(int)((float)(cwidth-RIGHTOFFSET-200)/aspectRatio);	
			pictBoxRect.SetRect(200,70,cwidth-RIGHTOFFSET,70+height);
		}else{
		int width=(int)((float)(cheight-BOTTOMOFFSET-20-70)*aspectRatio);
		pictBoxRect.SetRect(200,70,200+width,cheight-BOTTOMOFFSET-20);
		}
	}else{//横長の場合	
		if(dialogaspectratio>aspectRatio){
			int width=(int)((float)(cheight-BOTTOMOFFSET-20-70)*aspectRatio);
			pictBoxRect.SetRect(200,70,200+width,cheight-BOTTOMOFFSET-20);
		}else{
			int height=(int)((float)(cwidth-RIGHTOFFSET-200)/aspectRatio);	
			pictBoxRect.SetRect(200,70,cwidth-RIGHTOFFSET,70+height);
		}
	}

}
void CclippingImageMFCDlg::adjustControllPlacement(int cwidth,int cheight){
	//OnSizeのときのみ使う
	//this->GetClientRect(&clientRect);
	//この二つは常にダイアログの下のほうにいること
	progressText.MoveWindow(0,cheight-BOTTOMOFFSET,70,20);
	CProgressCtrl.MoveWindow(70,cheight-BOTTOMOFFSET,300,20);
	
	//pictBoxもサイズ調整しなおし。
	adjustImageSize(cwidth,cheight);
}
void CclippingImageMFCDlg:: afterGetFilePath(){
	
	SetDlgItemText(IDC_ORIGINALNAME,sheedfiletitle+L".bmp");
		UpdateData(FALSE);
	filePathTextBox.SetWindowTextW(sheedFilePath);
		wchar_t buf[_MAX_PATH];
		GetCurrentDirectory(_MAX_PATH,buf);
		directory.Format(L"%s",buf);
		CString outputfilename;
		outputfilename=L"_"+sheedfiletitle+L".bmp";
		SetDlgItemText(IDC_OUTPUTNAME,outputfilename);
		
		getBitmapProfile();
		if(bitmapInfoHeader.biBitCount>=24){
			CString str;
			str.Format(L"1ピクセルあたり%dビットのbmpには対応していません。8ビットか12ビットのbmpを選んでください。",bitmapInfoHeader.biBitCount);
			MessageBox(str);}else{
		
		dib.Open(&sheedFilePath);
		if(dib.IsValid()){
			aspectRatio= (float)dib.getWidth()/(float)dib.getHeight();
			int longer = max(dib.getWidth(),dib.getHeight());
			scalex=(float)dib.getWidth()/(float)pictBoxRect.Width();
			scaley=(float)dib.getHeight()/(float)pictBoxRect.Height();
			//長いほうに合わせて
			//長い方に合わせてアスペクト比を適用
			adjustImageSize(clientRect.Width(),clientRect.Height());
			//ここでpictBoxのサイズも変わっているはず。なのになぜ？
			//画像が変わったんだからpictboxrectも変えなくては
				InvalidateRect(pictBoxRect,FALSE);
			//Invalidate();//(pictBoxRect,FALSE);
		}else{
			MessageBox(L"bmp画像を選んでください");
		}
			}
}
void CclippingImageMFCDlg::OnBnClickedFileselect2()
{
	 CString         filter("BMP Files (*.bmp)|*.bmp|");
    CFileDialog     selDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, filter);
    
    if (selDlg.DoModal() == IDOK)
    {
		
        sheedFilePath = selDlg.GetPathName();
        sheedfiletitle = selDlg.GetFileTitle();
		
		
		afterGetFilePath();

		
			
	}

    
		 
}
void CclippingImageMFCDlg::OnDropFiles(HDROP hDropInfo)
{
	// TODO: ここにメッセージ ハンドラー コードを追加するか、既定の処理を呼び出します。
	TCHAR FileName[100];
    int NameSize = sizeof(FileName);
    int FileNumber;
    
   

    FileNumber = DragQueryFile(hDropInfo, 0, FileName, NameSize);
    sheedFilePath.Format(L"%s", FileName);
	//exeファイルのパスを分解
	TCHAR drive[_MAX_DRIVE];
	TCHAR dir[_MAX_DIR];
	TCHAR fname[_MAX_FNAME];
	TCHAR ext[_MAX_EXT];
	_wsplitpath(FileName,drive,dir,fname,ext);
	directory.Format(L"%s",dir);
	SetCurrentDirectory(directory);
	sheedfiletitle.Format(L"%s",fname);
	
	afterGetFilePath();
 

   
	CDialogEx::OnDropFiles(hDropInfo);
}
void CclippingImageMFCDlg::OnSize(UINT nType, int cx, int cy)
{//cx,cyが変更後のサイズかな？
	CDialogEx::OnSize(nType, cx, cy);
	GetClientRect(&clientRect);
	if(flg){
		
		adjustControllPlacement(cx,cy);
		Invalidate();

	}
}
void CclippingImageMFCDlg::setRect(CRect *rect,CPoint *p1,CPoint *p2){
	int top,left,right,bottom;
		right=max(p1->x,p2->x);
		left= min(p1->x,p2->x);
		top=min(p1->y,p2->y);
		bottom= max(p1->y,p2->y);
	rect->SetRect(left,top,right,bottom);
}
void CclippingImageMFCDlg::makeMiniFile16bit(CString *filepath,CString *numst){	
	short int  *image;
	image = new short int[bitmapInfoHeader.biSizeImage];//ここで1000*1000
	readImage(image,numst);
	short int* outputImage = new short int[(outputRect.Width())*outputRect.Height()];
	makeOutPutImageData(image,outputImage);
	makeCSVfile(outputImage,numst);
	writeImage(outputImage,numst);

	delete image;
   
}
void CclippingImageMFCDlg::makeCSVfile(short int *outputImage,CString *numst){
	CString outputcsvname;
		if(foldercheck){
			outputcsvname=directory+L"\\"+foldername+L"\\"+prefix+L"_"+datasetname+L"-"+*numst+L".csv";
		}else{
			outputcsvname=directory+L"\\"+prefix+L"_"+datasetname+L"-"+*numst+L".csv";
		}
		ofstream csvfile(outputcsvname);
		csvfile.setf(ios::dec);
		
		for(int y=realClippingRect.Height();y>0;y--){//上下逆かもしれないけど、
			stringstream str("");
			for(int x=0;x<realClippingRect.Width();x++){//ここでは４の倍数にする必要なし。
				csvfile<<(int)outputImage[((y)*outputRect.Width())+x]<<",";	
			}
			csvfile<<"\n";	
		}
		csvfile.close();
}
void CclippingImageMFCDlg::readImage(short int* image,CString *numst){
	HANDLE handle;
	CString filepath;
	filepath=directory+L"\\"+datasetname+L"-"+*numst+L".bmp";
	DWORD temp;
	handle = CreateFile(filepath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );	
	//たぶん、1078バイト分がヘッダだよね。
	SetFilePointer(handle, bitmapFileHeader.bfOffBits, NULL, FILE_BEGIN);//次にファイルポインタをヘッダ分ずらして
	//image is being use without initialize
	BOOL ok =ReadFile(handle,image,bitmapInfoHeader.biSizeImage*sizeof(short int),&temp,NULL);
	//imageに何も入っていない。
	CloseHandle(handle);

}
void CclippingImageMFCDlg::writeImage(short int* outputImage,CString *numst){
	HANDLE hfile;
	DWORD temp;
	CString outputfilename;
   if(foldercheck){
			outputfilename=directory+L"\\"+foldername+L"\\"+prefix+L"_"+datasetname+L"-"+*numst+L".bmp";
		}else{
			outputfilename=directory+L"\\"+prefix+L"_"+datasetname+L"-"+*numst+L".bmp";}
    
	hfile = CreateFile(outputfilename, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0, NULL);

	WriteFile(hfile, &obitmapFileHeader, sizeof(BITMAPFILEHEADER), &temp, NULL);//まずはファイルヘッダを書く。
    WriteFile(hfile, &obitmapInfoHeader, sizeof(BITMAPINFOHEADER), &temp, NULL);//インフォヘッダを書く
	
	WriteFile(hfile, outputImage,obitmapInfoHeader.biSizeImage*sizeof(short int), &temp, NULL);//画像の中身を書く。
	CloseHandle(hfile);
	
}
void CclippingImageMFCDlg::makeOutPutImageData(short int*data,short int *outdata){
	//ここで切り取り作業だ。
	int xcount=0;
	int ycount=0;

	

	//元画像の横幅が４の倍数でなかった場合
	int truewidth;
	if(bitmapInfoHeader.biWidth%4 !=0){
		truewidth=bitmapInfoHeader.biWidth + (4-bitmapInfoHeader.biWidth%4 );
	}else{
		truewidth=bitmapInfoHeader.biWidth;
	}
	for(int y=bitmapInfoHeader.biHeight;y>0;y--){
		for(int x=0;x<truewidth;x++){
			//もし水平方向のバイト数が４の倍数でないときはNULLで埋めて４の倍数にする
			if(outputRect.PtInRect(CPoint(x,y))){
				if(realClippingRect.right>x){
					outdata[((ycount)*outputRect.Width())+xcount]=data[(bitmapInfoHeader.biHeight-y)*bitmapInfoHeader.biWidth+x];	
				}else{
					outdata[((ycount)*outputRect.Width())+xcount]=0x00;
				}	
					xcount++;
					if(xcount>=outputRect.Width()){
						ycount++;
						xcount=0;
					}	
			}
		}
	}
	
}
void CclippingImageMFCDlg::getBitmapProfile(){
	HANDLE handle;
	DWORD temp;

	handle = CreateFile(sheedFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
	// DIBファイルヘッダーを開き、読み込む
	
	ReadFile(handle,&bitmapFileHeader,sizeof(BITMAPFILEHEADER),&temp,NULL);
	ReadFile(handle,&bitmapInfoHeader,sizeof(BITMAPINFOHEADER),&temp,NULL);
	if(bitmapInfoHeader.biBitCount<24){
	ReadFile(handle,rgbquad,1024,&temp,NULL);
	}
	CloseHandle(handle);
}
void CclippingImageMFCDlg::makeOutPutImageData(BYTE *data,BYTE *outdata){
	//ここで切り取り作業だ。
	int xcount=0;
	int ycount=0;
	//元画像の横幅が４の倍数でなかった場合
	int truewidth;
	if(bitmapInfoHeader.biWidth%4 !=0){
		truewidth=bitmapInfoHeader.biWidth + (4-bitmapInfoHeader.biWidth%4 );
	}else{
		truewidth=bitmapInfoHeader.biWidth;
	}
	for(int y=bitmapInfoHeader.biHeight;y>=0;y--){
		for(int x=0;x<truewidth;x++){
			//もし水平方向のバイト数が４の倍数でないときはNULLで埋めて４の倍数にする
			if(outputRect.PtInRect(CPoint(x,y))){
				if(realClippingRect.right>x){
					outdata[((ycount)*outputRect.Width())+xcount]=data[(bitmapInfoHeader.biHeight-1-y)*truewidth+x];	
					//ビットマップは下から上へ向かって描画するのでbitmapInfoHeader.biHeight-1-yにした
				}else{
					outdata[((ycount)*outputRect.Width())+xcount]=0x00;
				}	
					xcount++;
					if(xcount>=outputRect.Width()){
						ycount++;
						xcount=0;
					}	
			}
		}
	}
	
}
void CclippingImageMFCDlg::makeMiniFile(CString *numst){
	
	BYTE *image = new BYTE[bitmapInfoHeader.biSizeImage];//ここで1000*1000
	readImage(image,numst);
	
	BYTE *outputImage = new BYTE[(outputRect.Width())*outputRect.Height()];
	makeOutPutImageData(image,outputImage);
	
	delete image;
	
	if(csvcheck){makeCSVfile(outputImage,numst);}

	writeImage(outputImage,numst);
	
   	delete outputImage;
}
void CclippingImageMFCDlg::makeCSVfile(BYTE *outputImage,CString *numst){
	CString outputcsvname;
		if(foldercheck){
			outputcsvname=directory+L"\\"+foldername+L"\\"+prefix+L"_"+datasetname+L"-"+*numst+L".csv";
		}else{
			outputcsvname=directory+L"\\"+prefix+L"_"+datasetname+L"-"+*numst+L".csv";
		}
		ofstream csvfile(outputcsvname);
		csvfile.setf(ios::dec);
		
		for(int y=realClippingRect.Height()-1;y>=0;y--){//上下逆かもしれないけど、
			for(int x=0;x<realClippingRect.Width();x++){//ここでは４の倍数にする必要なし。
				csvfile<<(int)outputImage[((y)*outputRect.Width())+x]<<",";	
			}
			csvfile<<"\n";	
		}
		csvfile.close();
}
void CclippingImageMFCDlg::readImage(BYTE* image,CString *numst){
	HANDLE handle;
	CString filepath;
	filepath=directory+L"\\"+datasetname+L"-"+*numst+L".bmp";
	DWORD temp;
	handle = CreateFile(filepath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );	
	//たぶん、1078バイト分がヘッダだよね。
	SetFilePointer(handle, bitmapFileHeader.bfOffBits, NULL, FILE_BEGIN);//次にファイルポインタをヘッダ分ずらして
	//image is being use without initialize
	BOOL ok =ReadFile(handle,image,bitmapInfoHeader.biSizeImage,&temp,NULL);
	//imageに何も入っていない。
	CloseHandle(handle);

}
void CclippingImageMFCDlg::writeImage(BYTE* outputImage,CString *numst){
	HANDLE hfile;
	DWORD temp;
	CString outputfilename;
   if(foldercheck){
			outputfilename=directory+L"\\"+foldername+L"\\"+prefix+L"_"+datasetname+L"-"+*numst+L".bmp";
		}else{
			outputfilename=directory+L"\\"+prefix+L"_"+datasetname+L"-"+*numst+L".bmp";}
    
	hfile = CreateFile(outputfilename, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0, NULL);

	WriteFile(hfile, &obitmapFileHeader, sizeof(BITMAPFILEHEADER), &temp, NULL);//まずはファイルヘッダを書く。
    WriteFile(hfile, &obitmapInfoHeader, sizeof(BITMAPINFOHEADER), &temp, NULL);//インフォヘッダを書く
	WriteFile(hfile, rgbquad,1024, &temp, NULL);//RGBQUADを書く
	WriteFile(hfile, outputImage,obitmapInfoHeader.biSizeImage, &temp, NULL);//画像の中身を書く。
	CloseHandle(hfile);
	
}
int CclippingImageMFCDlg::getSheedNumber(){
	int sheedid=0;
	int hyphenposition = sheedfiletitle.ReverseFind('-');
	if(hyphenposition <0){MessageBox(L"データ名-数字.bmp 形式のファイルを選んで下さい");
	return -1;
	}
	datasetname=sheedfiletitle.Left(hyphenposition);
	wchar_t c[3];
	int digitnum=0;
	for(hyphenposition++;hyphenposition<sheedfiletitle.GetLength();hyphenposition++){
		if(sheedfiletitle[hyphenposition] !='.'){
			c[digitnum]  = sheedfiletitle[hyphenposition];
			digitnum++;
		}else{break;}
		
	}	
	
	for(int i=0;i<digitnum;i++){
		sheedid+=(c[i]-48)*(int)pow(10.0f,(float)(digitnum-i-1));
	}

	return sheedid;
}
void CclippingImageMFCDlg::OnBnClickedMakeFile(){
	//画像生成ボタン
	GetDlgItemText(IDC_PREFIX,prefix);
	
	int sheedid;
	sheedid=getSheedNumber();
	if(sheedid>=0){
	maxrepeat=GetDlgItemInt(IDC_MAXNUM);
	if(foldercheck){
			GetDlgItemText(IDC_FOLDERNAME,foldername);
	}
	//繰り返す必要のない初期化処理をここでする。
	setRect(&realClippingRect,&realbegin,&realend);
	if(realClippingRect.Width()<=0 || realClippingRect.Height()<=0){
		MessageBox(L"切り取り範囲を指定してください");
	}
	else{
	getBitmapProfile();
	needForQuad=4-(realClippingRect.Width()%4);//4の倍数になるためにはあと何個足せばいい？
	if(needForQuad==4){needForQuad=0;}
	
	outputRect.SetRect(realClippingRect.left,realClippingRect.top,realClippingRect.right+needForQuad,realClippingRect.bottom);
	obitmapInfoHeader=bitmapInfoHeader;
	obitmapFileHeader=bitmapFileHeader;
	
	obitmapInfoHeader.biWidth=realClippingRect.Width();
	obitmapInfoHeader.biHeight=realClippingRect.Height();
	obitmapInfoHeader.biSizeImage=realClippingRect.Height()*(realClippingRect.Width()+needForQuad);
	obitmapFileHeader.bfSize=bitmapFileHeader.bfOffBits+obitmapInfoHeader.biSizeImage;
	
	CString folderpath =directory+L"\\"+foldername;//+L"\\";
	//フォルダを作る
	if(foldercheck){
		 CreateDirectory( folderpath, NULL );
	}
	for(int i=sheedid;i<=maxrepeat;i++){
		CFileFind find;
		CString numst;
		numst.Format(L"%d",i);
		CString filepath=directory+L"\\"+datasetname+L"-"+numst+L".bmp";
		BOOL ok =find.FindFile(filepath);
		if(ok){
			
			if(bitmapInfoHeader.biBitCount <16){
				makeMiniFile(&numst);
			}else{//12-16ビットはこっち
				makeMiniFile16bit(&filepath,&numst);
			}
		}else{//ファイル存在しないので飛ばす。
		}
		CProgressCtrl.SetPos(i);
	}
	MessageBox(L"完成！");
	}  
	}
}
void CclippingImageMFCDlg::pointConversion(CPoint *point){
	CPoint pt=CPoint(pictBoxRect.left,pictBoxRect.top);//座標体系が違うみたいなので
	currentPoint=*point-pt;
}
void CclippingImageMFCDlg::coordinateConversion(CPoint *point,CPoint *out){
	
	out->SetPoint((int)((float)point->x*scalex),(int)((float)point->y*scaley));
	
}
void CclippingImageMFCDlg::coordinateConversion(CRect *rect,CRect *out){
	
	out->SetRect((int)((float)rect->left*scalex),(int)((float)rect->top*scaley),(int)((float)rect->right*scalex),(int)((float)rect->bottom*scaley));
	
}
void CclippingImageMFCDlg::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: ここにメッセージ ハンドラー コードを追加するか、既定の処理を呼び出します。
	pointConversion(&point);
	
	if(pictBoxRect.PtInRect(point)){
		//タイトルバーの分下に下げる
		textFocus=false;
		CString str;
		coordinateConversion(&currentPoint,&realCurrentPoint);
		str.Format(L"座標値(%d,%d)",realCurrentPoint.x,realCurrentPoint.y);
		currentPositionText.SetWindowTextW(str);
		//描画するときはy座標をずらしたほうがよい
		if(drawFlag){
			end=currentPoint;
			CString str;

			coordinateConversion(&end,&realend);
			SetDlgItemInt(IDC_ENDX,realend.x);
			SetDlgItemInt(IDC_ENDY,realend.y);
		}
		}//ptinrect
	CDialogEx::OnMouseMove(nFlags, point);
}
void CclippingImageMFCDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: ここにメッセージ ハンドラー コードを追加するか、既定の処理を呼び出します。
	pointConversion(&point);
	if(pictBoxRect.PtInRect(point)){
		//textFocus=false;
		begin=currentPoint;
		
		coordinateConversion(&begin,&realbegin);
		SetDlgItemInt(IDC_BEGINX,realbegin.x);
		SetDlgItemInt(IDC_BEGINY,realbegin.y);
		drawFlag=true;
	}
		
	CDialogEx::OnLButtonDown(nFlags, point);
}
void CclippingImageMFCDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: ここにメッセージ ハンドラー コードを追加するか、既定の処理を呼び出します。
	pointConversion(&point);
	if(pictBoxRect.PtInRect(point)){
		textFocus=false;
		end=currentPoint;
		
		coordinateConversion(&end,&realend);
		SetDlgItemInt(IDC_ENDX,realend.x);
		SetDlgItemInt(IDC_ENDY,realend.y);
		
		
		}//ptinlect
		drawFlag=false;
	
		
	CDialogEx::OnLButtonUp(nFlags, point);

}
void CclippingImageMFCDlg::OnDestroy()
{
	CDialogEx::OnDestroy();
}
HBRUSH CclippingImageMFCDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

	//// TODO:  ここで DC の属性を変更してください。
	// if (nCtlColor == CTLCOLOR_DLG)
 //   {
 //       if (*pWnd == *this)
 //       {
 //           // 背景色
 //           hbr = static_cast<HBRUSH>(GetStockObject(WHITE_BRUSH));
 //       }
 //   }
	// TODO:  既定値を使用したくない場合は別のブラシを返します。
	return hbr;
}
BOOL CclippingImageMFCDlg::PreTranslateMessage(MSG* pMsg)
{
	// TODO: ここに特定なコードを追加するか、もしくは基本クラスを呼び出してください。
	
	if(pMsg->message == WM_KEYDOWN)
		{
			
			switch(pMsg->wParam) {
			case VK_RETURN:
				//returnで終了しないでほしい
				return TRUE;
			// ……
			}
		}
	return CDialogEx::PreTranslateMessage(pMsg);
}
void CclippingImageMFCDlg::OnEnChangeBeginx()
{
	
	if(textFocus){
		realbegin.x=GetDlgItemInt(IDC_BEGINX);
		begin.x=(int)((float)realbegin.x/scalex);
		
	}
	if(flg){InvalidateRect(pictBoxRect,FALSE);}
	
}
void CclippingImageMFCDlg::OnEnChangeBeginy()
{
	if(textFocus){
		
		realbegin.y=GetDlgItemInt(IDC_BEGINY);
		begin.y=(int)((float)realbegin.y/scaley);
		
	}
	if(flg){InvalidateRect(pictBoxRect,FALSE);}
}
void CclippingImageMFCDlg::OnEnChangeEndx()
{
	if(textFocus){
		realend.x=GetDlgItemInt(IDC_ENDX);
		end.x=(int)((float)realend.x/scalex);
		
	}
	if(flg){InvalidateRect(pictBoxRect,FALSE);}
	// TODO:  ここにコントロール通知ハンドラー コードを追加してください。
}
void CclippingImageMFCDlg::OnEnChangeEndy()
{
	if(textFocus){
		realend.y=GetDlgItemInt(IDC_ENDY);
		end.y=(int)((float)realend.y/scaley);
		
	}
	if(flg){InvalidateRect(pictBoxRect,FALSE);}
	// TODO:  ここにコントロール通知ハンドラー コードを追加してください。
}
void CclippingImageMFCDlg::OnEnSetfocusBeginx()
{
	textFocus=true;
	// TODO: ここにコントロール通知ハンドラー コードを追加します。
}
void CclippingImageMFCDlg::OnEnSetfocusBeginy()
{
	textFocus=true;
	// TODO: ここにコントロール通知ハンドラー コードを追加します。
}
void CclippingImageMFCDlg::OnEnSetfocusEndx()
{
	textFocus=true;
	// TODO: ここにコントロール通知ハンドラー コードを追加します。
}
void CclippingImageMFCDlg::OnEnSetfocusEndy()
{
	textFocus=true;
	// TODO: ここにコントロール通知ハンドラー コードを追加します。
}
void CclippingImageMFCDlg::OnEnChangePrefix()
{
}
void CclippingImageMFCDlg::OnBnClickedCsv()
{
	// TODO: ここにコントロール通知ハンドラー コードを追加します。
	csvcheck=!csvcheck;
}
void CclippingImageMFCDlg::OnBnClickedCheck1()
{
	foldercheck=!foldercheck;
}



