//////////////////////////////////////////
// LightCycleProc.h
// Copyright (c) 10/30/2021 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_BITMAP), 7);
	//ツールバーボタン追加
	TBBUTTON tbb[10];
	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_ADD;
	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].fsState = TBSTATE_ENABLED;
	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].fsStyle = TBSTYLE_BUTTON;
	tbb[6].idCommand = IDM_GO;
	tbb[7].iBitmap = TBar.m_id + 5;
	tbb[7].fsStyle = TBSTYLE_BUTTON;
	tbb[7].idCommand = IDM_STOP;
	tbb[8].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[9].iBitmap = TBar.m_id + 6;
	tbb[9].fsState = TBSTATE_ENABLED;
	tbb[9].fsStyle = TBSTYLE_BUTTON;
	tbb[9].idCommand = IDM_VERSION;
	TBar.AddButtons(10, tbb);

	//ステータスバー登録−Init(hWnd, hIinstance, ID, (以下省略可）Style)
	SBar.Init(m_hWnd, m_hInstance, STATUSBAR);
	//ステータスバー区画設定
	int sec[3] = {100, 300, -1};
	SBar.SetSection(3, sec);
	//ステータスバー文字列設定
	SBar.SetText(0, "LightCycle Ver 1.0");
	SBar.SetText(2, "マウス左クリックでケーム実行、右クリックでゲーム中止");

	//仮想ウィンドウの初期化
	m_cvs.SetCanvas(m_hWnd);
	//背景を黒の塗り潰しブラシで描画
	m_cvs.Color(0);
	m_cvs.BrSelection(1);
	m_cvs.Clear();

	//LightCycleのデバイスコンテキストの設定
	//m_LC[0].SetDC(m_cvs.hDC());でもよい
	CLIGHTCYCLE::m_hDC = m_cvs.hDC();

	//「ゲームメニュー」とステータスバーを不可にする
	ChangeMenuStatus(FALSE, FALSE);  

	//LightCycle登録数の初期化
	m_NoLC = 0;

	return TRUE;
}

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

	int no;
	switch(wParam) {
	case IDT_TIMER0:
		no = 0;
		break;
	case IDT_TIMER1:
		no = 1;
		break;
	case IDT_TIMER2:
		no = 2;
		break;
	case IDT_TIMER3:
		no = 3;
		break;
	default:
		return FALSE;
	}
	if(m_LC[no].CanGo()) {
		m_cvs.Color(m_LC[no].m_Color);			//競技車両色で
		m_cvs.Dot(m_LC[no].m_x, m_LC[no].m_y);	//走行痕ドットを打つ
	}
	else {
		//タイマー割り込みを停止
		m_tm[no].Stop();
		//ステータスバー第3区分の文字列取得
		char str[MAX_PATH];
		SBar.GetText(2, str);
		CSTR Msg1 = str;
	 	CSTR Msg2 = g_Col[m_LC[no].m_Color - 8];
		Msg2 = Msg2 + "号";
		Msg2 = Msg2 + m_LC[no].Dead();
		Msg1 = Msg1 + Msg2;
		SBar.SetText(2, Msg1.ToChar());
	}
	//ゲーム終了処理
	if(!m_LC[0].m_Alive && !m_LC[1].m_Alive &&
		!m_LC[2].m_Alive && !m_LC[3].m_Alive) {
		MessageBox(m_hWnd, "全車両停止しました", "競技終了",
					MB_OK | MB_ICONEXCLAMATION);
		g_On = FALSE;
		ChangeMenuStatus(TRUE, FALSE);
	}
	return TRUE;
}

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

	//メニューアイテムインフォ構造体
	MENUITEMINFO mii;
	//メニューハンドルの取得
	HMENU hMenu = GetMenu(m_hWnd);
	HMENU hGameMenu = GetSubMenu(hMenu, 1);
	mii.cbSize = sizeof(mii);
	mii.fMask = MIIM_STATE;
	GetMenuItemInfo(hGameMenu, IDM_GO, FALSE, &mii);
	if(mii.fState & MFS_DISABLED) {
		MessageBox(m_hWnd, "現在左クリックは使用できません", "注意",
					MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	else {
		OnGo();
		return TRUE;
	}
}

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

	//メニューアイテムインフォ構造体
	MENUITEMINFO mii;
	//メニューハンドルの取得
	HMENU hMenu = GetMenu(m_hWnd);
	HMENU hGameMenu = GetSubMenu(hMenu, 1);
	mii.cbSize = sizeof(mii);
	mii.fMask = MIIM_STATE;
	GetMenuItemInfo(hGameMenu, IDM_STOP, FALSE, &mii);
	if(mii.fState & MFS_DISABLED) {
		MessageBox(m_hWnd, "現在右クリックは使用できません", "注意",
					MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	else {
		OnStop();
		return TRUE;
	}
}

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

	//ツールバーツールチップ−因みにこの時のidCtrl(wParam)はメニューアイテムになる（例：IDM_OPEN）
	if(((LPNMHDR)lParam)->code == TTN_NEEDTEXT) {	//TTN_GETDISPINFOと同じ
		((LPTOOLTIPTEXT)lParam)->hinst = m_hInstance;
		char* tag;
		switch(((LPTOOLTIPTEXT)lParam)->hdr.idFrom) {
		case IDM_ADD:
			tag = "追加・編集";
			break;
		case IDM_OPEN:
			tag = "データを開く";
			break;
		case IDM_SAVE:
			tag = "データの保存";
			break;
		case IDM_EXIT:
			tag = "終了";
			break;
		case IDM_GO:
			tag = "実行";
			break;
		case IDM_STOP:
			tag = "中止";
			break;
			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();
	//ゲーム開始迄にゲーム領域を確定する
	if(!g_On) {
		CLIGHTCYCLE::m_MinX = 0;
		CLIGHTCYCLE::m_MaxX = LOWORD(lParam);
		RECT rec;
		GetWindowRect(TBar.m_hWnd, &rec);
		CLIGHTCYCLE::m_MinY = rec.bottom - rec.top;
		CLIGHTCYCLE::m_MaxY = HIWORD(lParam);	//仮置き
		GetWindowRect(SBar.m_hWnd, &rec);
		CLIGHTCYCLE::m_MaxY -= (rec.bottom - rec.top);
		//競技場枠の表示
		m_cvs.Clear();
		m_cvs.Color(7);
		m_cvs.Box(CLIGHTCYCLE::m_MinX, CLIGHTCYCLE::m_MinY, CLIGHTCYCLE::m_MaxX, CLIGHTCYCLE::m_MaxY, 0);
		//競技場座標の表示
		char str[64];
		wsprintf(str, "競技場 (%d,%d)-(%d,%d)", CLIGHTCYCLE::m_MinX, CLIGHTCYCLE::m_MinY, CLIGHTCYCLE::m_MaxX, CLIGHTCYCLE::m_MaxY);
		SBar.SetText(1, str);
	}
	return TRUE;
}

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

	PAINTSTRUCT paint;
	m_cvs.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) {
		//タイマーを廃棄
		for(int i = 0; i < m_NoLC; i++)
			m_tm[i].Stop();
		//処理をするとDestroyWindow、PostQuitMessageが呼ばれる
		return TRUE;
	}
	else
		//そうでなければウィンドウではDefWindowProc関数をreturn、ダイアログではreturn FALSEとなる。
		return FALSE;
}

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

	//典型的なウィンドウのサイズ制限処理
	MINMAXINFO *pmmi;
	pmmi = (MINMAXINFO*)lParam;
	pmmi->ptMinTrackSize.x = 656;	// 最小幅（競技エリア640）
	pmmi->ptMinTrackSize.y = 509;	// 最小高（競技エリア400）

	return FALSE;					//処理はDefWndProcに任す
}

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

	if(inputdlg.DoModal(m_hWnd, "IDD_INPUT", inputdlgProc)) {
		if(m_NoLC)	//m_NoLCが0でなくなったらゲーム実行可能
			ChangeMenuStatus(TRUE, FALSE);
		return TRUE;
	}
	else {
		MessageBox(m_hWnd, "処理がキャンセルされました。", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
}

bool CMyWnd::OnOpen() {

	char* fn = cmndlg.GetFileName(m_hWnd, "LightCycleデータファイル(*.lcd)\0*.lcd\0\0", TRUE, "lcd", ".", "LightCycleデータを開く");
	if(fn) {
		g_File.SetName(fn);	//ファイルパス、名の登録
		m_NoLC = g_File.ReadInt("車両", "台数");
		char str[16];		//セクション名用バッファ
		int Color, StartDir, StartX, StartY, Speed, Caprice;	//各属性変数
		for(int i = 0; i < m_NoLC; i++) {
			wsprintf(str, "車両No. %d", i);
			Color = g_File.ReadInt(str, "車両色");
			StartDir = g_File.ReadInt(str, "方向");
			StartX = g_File.ReadInt(str, "X座標");
			StartY = g_File.ReadInt(str, "Y座標");
			Speed = g_File.ReadInt(str, "速度");
		    Caprice = g_File.ReadInt(str, "転回頻度");
			//データをセットするのみならず、走行可能状態にする
			m_LC[i].SetData(Color, StartDir, StartX, StartY, Speed, Caprice);
		}
		//m_NoLCが0でなくなったら以下を実行する。
		if(m_NoLC)
			ChangeMenuStatus(TRUE, FALSE);
		return TRUE;
	}
	else {
		MessageBox(m_hWnd, "処理がキャンセルされました", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
}

bool CMyWnd::OnSave() {

	char* fn = cmndlg.GetFileName(m_hWnd, "LightCycleデータファイル(*.lcd)\0*.lcd\0\0", FALSE, "lcd", ".", "LightCycleデータを保存");
	if(fn) {
		g_File.SetName(fn);	//ファイルパス、名の登録
		g_File.WriteInt("車両", "台数", m_NoLC);
		char str[16];		//セクション名用バッファ
		for(int i = 0; i < m_NoLC; i++) {
			wsprintf(str, "車両No. %d", i);
		    g_File.WriteInt(str, "車両色", m_LC[i].m_Color);
		    g_File.WriteInt(str, "方向", m_LC[i].m_StartDir);
		    g_File.WriteInt(str, "X座標", m_LC[i].m_StartX);
		    g_File.WriteInt(str, "Y座標", m_LC[i].m_StartY);
		    g_File.WriteInt(str, "速度", m_LC[i].m_Speed);
		    g_File.WriteInt(str, "転回頻度", m_LC[i].m_Caprice);
		}
		return TRUE;
	}
	else {
		MessageBox(m_hWnd, "処理がキャンセルされました", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
}

bool CMyWnd::OnExit() {

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

bool CMyWnd::OnGo() {

	//ゲーム終了後は画面をクリア
	if(!g_On) {
		m_cvs.Clear();
		//競技場枠の表示
		m_cvs.Color(7);
		m_cvs.Box(CLIGHTCYCLE::m_MinX, CLIGHTCYCLE::m_MinY, CLIGHTCYCLE::m_MaxX, CLIGHTCYCLE::m_MaxY, 0);
	}
 	//競技車のデータが登録されてい ない場合の処置
	if(!m_NoLC) {
		MessageBox(m_hWnd, "競技車のデータが登録されていません\n「ファイル"\
						"「新規」または「データを開く」で設定してください。",
						"エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	else {
		//タイマーの設定（ミリ秒設定なので0.001秒タイマーとなっている）
		for(int i = 0; i < m_NoLC; i++) {
			if(!g_On)					//ゲーム開始前なら
				m_LC[i].GetReady();		//出走用意
			if(!m_tm[i].Begin(m_hWnd, g_Timer[i], g_Velo[m_LC[i].m_Speed])) {
				MessageBox(m_hWnd, "タイマーを設定できませんでした", "エラー",
					MB_OK | MB_ICONERROR);
				return FALSE;
			}
		}
		//ゲーム開始後は「実行」メニューアイテムとボタンを凍結する。
		g_On = TRUE;
		//「ファイル」メニューを不可にする
		EnableMenuItem(GetMenu(m_hWnd), 0, MF_BYPOSITION | MF_GRAYED);
		//「ゲーム」メニューのアイテムの状態を変更する
		ChangeMenuStatus(FALSE, TRUE);
		//ステータスバーによる結果表示の為
		SBar.SetText(2, "");
    	return TRUE;
	}
}

bool CMyWnd::OnStop() {

	int ret = MessageBox(m_hWnd, "完全に中止しますか（No−一時停止）", "確認",
						MB_YESNOCANCEL | MB_ICONQUESTION);
	switch(ret) {
	case IDYES:
		//全車死亡、タイマーを廃棄
		for(int i = 0; i < m_NoLC; i++)
			m_LC[i].Dead();
		g_On = FALSE;
	case IDNO:
		//タイマーを廃棄
		for(int i = 0; i < m_NoLC; i++) {
			m_tm[i].Stop();
		}
		//「ファイル」メニューを可にする
		EnableMenuItem(GetMenu(m_hWnd), 0, MF_BYPOSITION | MF_ENABLED);
		//「ゲーム」メニューのアイテムの状態を変更する
		ChangeMenuStatus(TRUE, FALSE);
		return TRUE;
	case IDCANCEL:
		return FALSE;
	}
}

bool CMyWnd::OnVersion() {

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

//////////////////
//ユーザー定義関数
//////////////////
///////////////////////////////////////////
//「ゲーム」メニュー、ツールバー状態の変更
///////////////////////////////////////////
void CMyWnd::ChangeMenuStatus(bool Flag1, bool Flag2) {

	//メニューハンドルの取得
	HMENU hMenu = GetMenu(m_hWnd);
	//メニューアイテムを不可にする
	HMENU hGameMenu = GetSubMenu(hMenu, 1);
	EnableMenuItem(hGameMenu, IDM_GO, MF_BYCOMMAND | (Flag1 ? MF_ENABLED : MF_GRAYED));
	EnableMenuItem(hGameMenu, IDM_STOP, MF_BYCOMMAND | (Flag2 ? MF_ENABLED : MF_GRAYED));
	DrawMenuBar(LightCycle.GetHandle());	//Re-draw "&Game" menu

	//ツールバー(MAKELONGマクロは16bit整数2つをunsigned 32bit整数にする)
	SendMessage(TBar.GetHandle(), TB_ENABLEBUTTON, IDM_GO, MAKELONG(Flag1, 0));
	SendMessage(TBar.GetHandle(), TB_ENABLEBUTTON, IDM_STOP, MAKELONG(Flag2, 0));
}

///////////////////////////////
//ユーザーダイアログの関数定義
//Inputダイアログ
///////////////////////////////
bool INPUTDLG::OnInit(WPARAM, LPARAM) {

	char str[16];	//コンボボックス登録用文字列変数
	//競技車番号
	for(int i = 0; i < LightCycle.m_NoLC; i++) {
		wsprintf(str, "%d", i + 1);
		SendItemMsg(IDC_COMBOBOX0, CB_ADDSTRING, 0, (LPARAM)str);
	}
	//競技車色
	for(int i = 0; i < 8; i++) {
		SendItemMsg(IDC_COMBOBOX1, CB_ADDSTRING, 0, (LPARAM)g_Col[i]);
	}
	//進行方向
	for(int i = 0; i < 8; i++) {
		SendItemMsg(IDC_COMBOBOX2, CB_ADDSTRING, 0, (LPARAM)g_Dir[i]);
	}
	//速度
	for(int i = 0; i < 3; i++) {
		SendItemMsg(IDC_COMBOBOX3, CB_ADDSTRING, 0, (LPARAM)g_Speed[i]);
    }
	//転回頻度
	for(int i = 0; i < 4; i++) {
		SendItemMsg(IDC_COMBOBOX4, CB_ADDSTRING, 0, (LPARAM)g_Caprice[i]);
	}
	//登録車両数が0 - 3迄は次の未入力LC[i]を、4の場合先頭を指すは
	if(LightCycle.m_NoLC < 4)
		SendItemMsg(IDC_COMBOBOX0, CB_SETCURSEL, LightCycle.m_NoLC, 0);
	else {
		SendItemMsg(IDC_COMBOBOX0, CB_SETCURSEL, 0, 0);
		SetData(0);
	}

	//対象コントロールのハンドルを取得する
	HWND hCtrl = GetDlgItem(m_hWnd, IDC_IMAGE);
	//文字列リソースのある親ウィンドウ（ダイアログ）のインスタンス
	m_hInstance;
	//ツールチップの作成
	m_hTip = CreateWindowEx(NULL, TOOLTIPS_CLASS, NULL,
				WS_POPUP | TTS_ALWAYSTIP | TTS_BALLOON,
				CW_USEDEFAULT, CW_USEDEFAULT,
				CW_USEDEFAULT, CW_USEDEFAULT,
				m_hWnd, NULL, 
				m_hInstance, NULL);
	//IDC_IMAGEにツールヒントコントロールを付ける
	TOOLINFO toolInfo = { 0 };	//ゼロクリアー
	toolInfo.cbSize = sizeof(toolInfo);
	toolInfo.hwnd = m_hWnd;
	toolInfo.uFlags = TTF_IDISHWND | TTF_SUBCLASS;
	toolInfo.uId = (UINT_PTR)GetDlgItem(m_hWnd, IDC_IMAGE);
	toolInfo.hinst = m_hInstance;
	toolInfo.lpszText = "編集状態でも、登録が4台未満ならクリックすると「追加」になります";
	SendMessage(m_hTip, TTM_ADDTOOL, 0, (LPARAM)&toolInfo);
	SetWindowPos(m_hTip, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
	return TRUE;
}

bool INPUTDLG::OnSelChange(WPARAM wParam) {

	//コンボボックスの選択変更以外は何もしない
	if(HIWORD(wParam) != CBN_SELCHANGE)
		return FALSE;
	//新しい選択アイテムインデックスを取得する
	int i = SendItemMsg(IDC_COMBOBOX0, CB_GETCURSEL, 0, 0);
	SetData(i);
	return TRUE;
}

bool INPUTDLG::OnImage() {

	if(LightCycle.m_NoLC < 4) {
		SendMsg(WM_SETTEXT, 0, (LPARAM)"LightCycleデータの追加");
		SendItemMsg(IDC_COMBOBOX0, CB_SETCURSEL, (WPARAM)-1, 0);
		SendItemMsg(IDC_COMBOBOX1, CB_SETCURSEL, (WPARAM)-1, 0);
		SendItemMsg(IDC_COMBOBOX2, CB_SETCURSEL, (WPARAM)-1, 0);
		SendItemMsg(IDC_COMBOBOX3, CB_SETCURSEL, (WPARAM)-1, 0);
		SendItemMsg(IDC_COMBOBOX4, CB_SETCURSEL, (WPARAM)-1, 0);
		SendItemMsg(IDC_EDIT2, WM_SETTEXT, 0, (LPARAM)"");
		SendItemMsg(IDC_EDIT3, WM_SETTEXT, 0, (LPARAM)"");
	}
}

bool INPUTDLG::OnOk() {

	//選択車両番号インデックス(0-3)を取得する
	int i = SendItemMsg(IDC_COMBOBOX0, CB_GETCURSEL, 0, 0);
	if(i == CB_ERR)	//選択が無ければ追加登録
		i = LightCycle.m_NoLC;
	//車両色(0-7)の取得
	int j = SendItemMsg(IDC_COMBOBOX1, CB_GETCURSEL, 0, 0);
	if(j == CB_ERR) {
		MessageBox(m_hWnd, "色が選択されていません。", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;	//ダイアログを開いたまま処理を無効とする
	}
	LightCycle.m_LC[i].m_Color = j + 8;	//CANVASクラスの色コード(8-15)
	//車両の方向(0-7)
	j = SendItemMsg(IDC_COMBOBOX2, CB_GETCURSEL, 0, 0);
	if(j == CB_ERR) {
		MessageBox(m_hWnd, "方向が選択されていません。", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;	//ダイアログを開いたまま処理を無効とする
	}
	LightCycle.m_LC[i].m_StartDir = j;
	//車両のX座標
	char str[16];		//エディットボックス用文字列変数
	SendItemMsg(IDC_EDIT2, WM_GETTEXT, 16, (LPARAM)str);
	j = atoi(str);		//エラー処理をどうするか？
	if(j <= 0 || j > CLIGHTCYCLE::m_MaxX) {
		MessageBox(m_hWnd, "Xの値が不正です。", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;	//ダイアログを開いたまま処理を無効とする
	}
	LightCycle.m_LC[i].m_StartX = j;
	//車両のY座標
	SendItemMsg(IDC_EDIT3, WM_GETTEXT, 16, (LPARAM)str);
	j = atoi(str);		//エラー処理をどうするか？
	if(j <= 0 || j > CLIGHTCYCLE::m_MaxY) {
		MessageBox(m_hWnd, "Xの値が不正です。", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;	//ダイアログを開いたまま処理を無効とする
	}
	LightCycle.m_LC[i].m_StartY = j;
	//車両の速度(0-2）
	j = SendItemMsg(IDC_COMBOBOX3, CB_GETCURSEL, 0, 0);
	if(j == CB_ERR) {
		MessageBox(m_hWnd, "速度が選択されていません。", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;	//ダイアログを開いたまま処理を無効とする
	}
	LightCycle.m_LC[i].m_Speed = j;
	//車両の転向頻度(0-3）
	j = SendItemMsg(IDC_COMBOBOX4, CB_GETCURSEL, 0, 0);
	if(j == CB_ERR) {
		MessageBox(m_hWnd, "転向頻度が選択されていません。", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;	//ダイアログを開いたまま処理を無効とする
	}
	LightCycle.m_LC[i].m_Caprice = j;
	//走行可能状態にする
	LightCycle.m_LC[i].GetReady();
	//追加登録の場合、車両台数を増やす
	if(i == LightCycle.m_NoLC)
		LightCycle.m_NoLC++;
	EndModal(TRUE);
	return TRUE;
}

bool INPUTDLG::OnCancel() {

	EndModal(FALSE);
	return TRUE;
}

void INPUTDLG::SetData(int i) {

	char str[16];	//エディットボックス用文字列変数
	//既存データが選択されたので編集であることを示す
	SendMsg(WM_SETTEXT, 0, (LPARAM)"LightCycleデータの編集");
	//CANVASクラスの色コード8-15を使用している為
	SendItemMsg(IDC_COMBOBOX1, CB_SETCURSEL, (LightCycle.m_LC[i].m_Color - 8), 0);
	SendItemMsg(IDC_COMBOBOX2, CB_SETCURSEL, LightCycle.m_LC[i].m_StartDir, 0);
	wsprintf(str, "%d", LightCycle.m_LC[i].m_StartX);
	SendItemMsg(IDC_EDIT2, WM_SETTEXT, 0, (LPARAM)str);
	wsprintf(str, "%d", LightCycle.m_LC[i].m_StartY);
	SendItemMsg(IDC_EDIT3, WM_SETTEXT, 0, (LPARAM)str);
	SendItemMsg(IDC_COMBOBOX3, CB_SETCURSEL, (WPARAM)LightCycle.m_LC[i].m_Speed, 0);
	SendItemMsg(IDC_COMBOBOX4, CB_SETCURSEL, LightCycle.m_LC[i].m_Caprice, 0);
}

///////////////////////////////
//ユーザーダイアログの関数定義
//Versionダイアログ
///////////////////////////////
bool VERSIONDLG::OnOk() {

	EndModal(TRUE);
	return TRUE;
}

bool VERSIONDLG::OnCancel() {

	EndModal(FALSE);
	return TRUE;
}
