//
//Author			: walk.ly
//Time			: 2010-06-22
//Version		: 1.0.0
//Description	: 小学生加法器（阐述了脚本对话框编写及消息响应） 	
//


#ifdef _VS_WALK
#include "wkClassDefine.h"
#endif

#include "wcDialogConstant.h"
/*	加法测试器 */

#define _Digit1 100
#define _Digit2 101
#define _Answer 102
#define _Tip	103
#define _CurTime	104
#define _BestTime	105
#define _BestAnswer	106

//产生算例
void FillDigit(wkDialog &dlg, int base)
{
	dlg.setText(_Digit1, toString(abs(random())%base));
	dlg.setText(_Digit2, toString(abs(random())%base));
	dlg.setText(_Answer, "");
	dlg.show(_Answer,4);
}

//创建对话框
void CreateDlg(wkDialog &dlg)
{
	int x=20, y=10, w=40, h=14;
	dlg.create("加法测试器");

	dlg.addCtrl(_Digit1, wdCtrlEdit, x, y, w, h, ES_READONLY|ES_RIGHT);
	y+=20; dlg.addCtrl("+", 8, y);
	dlg.addCtrl(_Digit2, wdCtrlEdit, x, y, w, h, ES_READONLY|ES_RIGHT);
	dlg.addCtrl("----------------", 8, y+12);
	y+=20; dlg.addCtrl("=", 8, y);
	dlg.addCtrl(_Answer, wdCtrlEdit, x, y, w, h, ES_CENTER);
	
	x+=w+6; y=10;
	//当前时间
	dlg.addCtrl(_CurTime, wdCtrlEdit, x, y, w*2+16, h, ES_READONLY|ES_CENTER);
	//计算结果指示
	y+=20; dlg.addCtrl(_Tip, wdCtrlEdit, x, y, w*2+16, h, ES_READONLY|ES_CENTER);
	//最佳用时(10题中最多正确，用时最少的结果)
	y+=20; dlg.addCtrl(_BestTime, wdCtrlEdit, x, y, w+8, h, ES_READONLY|ES_CENTER);
	//最高正确率
	x+=w+16; dlg.addCtrl(_BestAnswer, wdCtrlEdit, x, y, w, h, ES_READONLY|ES_CENTER);

	dlg.setAction(wdIdOk, wdMsgBnClicked);
	dlg.show();
	randomize();
	FillDigit(dlg, 100);
}

void main()
{
	wkDialog dlg;
	int ctrlId;
	CreateDlg(dlg);

	int clocksPerSec, beginClock;
	beginClock=clock(clocksPerSec);
	int year, mon, mday, hour, min, sec=-1, now;
	string s;

	while(1)	//循环等待模式
	{
		int act=dlg.peekAction(ctrlId);
		if (act == -1)//用户直接终止对话框
			break;

		//设置当前时间--------------------------------
		timeTm(time(), year, mon, mday, hour, min, now);
		if (sec<0 || now!=sec)
		{
			s.format("%d-%d-%d %02d:%02d:%02d", year, mon, mday, hour, min, now);
			dlg.setText(_CurTime, s);
			sec=now;
		}

		//响应"确认"消息------------------------------
		if (act && ctrlId==wdIdOk)
		{
			s=dlg.getText(_Tip);
			if (s.isEmpty())	//从回答第1题开始计时
				beginClock=clock();
			//显示对错标识
			bool right = (atoi(dlg.getText(_Answer)) ==
					atoi(dlg.getText(_Digit1)) + atoi(dlg.getText(_Digit2)));
			dlg.setText(_Tip, s+(right? "★":"×"));

			//做完10题后给出正确率和用时
			s=dlg.getText(_Tip);
			if (s.getLength()==20)
			{
				//10题用时
				double span=1.0*(clock()-beginClock)/clocksPerSec;
				//计算正确率
				for (int i=0, correct=0; i<s.getLength(); i+=2)
					if (s.mid(i,2)=="★") correct++;
				//正确率优先
				int lastCorrect=atoi(dlg.getText(_BestAnswer));
				if (correct>=lastCorrect)
				{
					s.format("%d", correct); dlg.setText(_BestAnswer, s);
					//填写用时
					if (correct>lastCorrect || span<atof(dlg.getText(_BestTime)))
					{
						s.format("%.2lf", span); dlg.setText(_BestTime, s);
					}
				}
				//清空答题正错提示
				dlg.setText(_Tip, "");
			}
			//出新题
			FillDigit(dlg, 100);
		}
	}
}