?? 24diandlg.cpp
字號:
}
SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
}
void CMy24DianDlg::OnButtonNoAnswer()
{
// TODO: Add your control notification handler code here
if(m_strAnswerList=="無解!")
{
MessageBox("正確!","信息",MB_ICONINFORMATION);
return;
}
if(!m_strAnswerList.IsEmpty())
{
MessageBox("不正確!\n本題目有解!","信息",MB_ICONINFORMATION);
return;
}
UpdateData();
CString strNum[4];
strNum[0]=m_strNum1;
strNum[1]=m_strNum2;
strNum[2]=m_strNum3;
strNum[3]=m_strNum4;
m_ctlEditAnswer.GetWindowText(m_strAnswer);
if(m_bIsEnter)
{
for(int i=0; i<4; i++)
m_dNum[i]=atof(strNum[i]);
}
SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
CExpression expression(m_dNum[0],m_dNum[1],m_dNum[2],m_dNum[3],atof(m_strResult));
if(!expression.ScanNum())
{
m_strAnswerList="無解!";
MessageBox("正確!","信息",MB_ICONINFORMATION);
}
else
{
m_strAnswerList="參考答案:\r\n";
m_strAnswerList+=expression.GetExpression();
m_strAnswerList.Replace("*","×");
m_strAnswerList.Replace("/","÷");
MessageBox("不正確!\n本題目有解!","信息",MB_ICONINFORMATION);
}
SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
}
void CMy24DianDlg::OnButtonNextAnswer()
{
// TODO: Add your control notification handler code here
if(!m_strAnswerList.IsEmpty())
{
if(m_strAnswerList=="無解!")
{
m_ctlEditAnswerList.SetWindowText(m_strAnswerList);
return;
}
CString strShowAnswer;
int nPos=0;
for(int i=0; i<m_nAnswerIndex+2; i++)
{
nPos=m_strAnswerList.Find('\n',nPos+1);
if(nPos==-1)
{
strShowAnswer=m_strAnswerList;
m_ctlEditAnswerList.SetWindowText(m_strAnswerList);
m_ctlEditAnswerList.SetSel(m_strAnswerList.GetLength(), m_strAnswerList.GetLength());
MessageBox("所有參考答案都已列出!","信息",MB_ICONINFORMATION);
return;
}
}
strShowAnswer=m_strAnswerList.Left(nPos+1);
m_nAnswerIndex++;
m_ctlEditAnswerList.SetWindowText(strShowAnswer);
m_ctlEditAnswerList.SetSel(strShowAnswer.GetLength(),strShowAnswer.GetLength());
return;
}
UpdateData();
CString strNum[4];
strNum[0]=m_strNum1;
strNum[1]=m_strNum2;
strNum[2]=m_strNum3;
strNum[3]=m_strNum4;
if(m_bIsEnter)
{
for(int i=0; i<4; i++)
m_dNum[i]=atof(strNum[i]);
}
SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
CExpression expression(m_dNum[0],m_dNum[1],m_dNum[2],m_dNum[3],atof(m_strResult));
if(expression.ScanNum())
{
m_strAnswerList="參考答案:\r\n";
m_strAnswerList+=expression.GetExpression();
m_strAnswerList.Replace("*","×");
m_strAnswerList.Replace("/","÷");
CString strShowAnswer;
int nPos=0;
for(int i=0; i<2; i++)
{
nPos=m_strAnswerList.Find('\n',nPos+1);
if(nPos==-1)
break;
}
if(nPos==-1)
{
MessageBox("所有參考答案都已列出!","信息",MB_ICONINFORMATION);
m_ctlEditAnswerList.SetWindowText(m_strAnswerList);
}
else
{
strShowAnswer=m_strAnswerList.Left(nPos+1);
m_ctlEditAnswerList.SetWindowText(strShowAnswer);
}
m_nAnswerIndex++;
}
else
{
m_strAnswerList="無解!";
m_ctlEditAnswerList.SetWindowText(m_strAnswerList);
}
SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
}
void CMy24DianDlg::OnButtonAllAnswer()
{
// TODO: Add your control notification handler code here
m_nAnswerIndex=0;
if(!m_strAnswerList.IsEmpty())
{
m_ctlEditAnswerList.SetWindowText(m_strAnswerList);
return;
}
UpdateData();
CString strNum[4];
strNum[0]=m_strNum1;
strNum[1]=m_strNum2;
strNum[2]=m_strNum3;
strNum[3]=m_strNum4;
if(m_bIsEnter)
{
for(int i=0; i<4; i++)
m_dNum[i]=atof(strNum[i]);
}
SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
CExpression expression(m_dNum[0],m_dNum[1],m_dNum[2],m_dNum[3],atof(m_strResult));
if(expression.ScanNum())
{
m_strAnswerList="參考答案:\r\n";
m_strAnswerList+=expression.GetExpression();
m_strAnswerList.Replace("*","×");
m_strAnswerList.Replace("/","÷");
}
else
{
m_strAnswerList="無解!";
}
m_ctlEditAnswerList.SetWindowText(m_strAnswerList);
SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
}
void CMy24DianDlg::OnUpdateEnterNum(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_bIsEnter);
}
void CMy24DianDlg::OnEnterNum()
{
// TODO: Add your command handler code here
ShowEnterCtl(TRUE);
m_nRestCount=0;
m_bIsEnter=TRUE;
m_strAnswerList="";
m_nAnswerIndex=0;
InitPos();
for(int i=0; i<5; i++)
{
InvalidateRect(m_rcCardPos[i], FALSE);
}
InitCardInfo();
InitEnterNum();
SetButtonEnabled();
m_bStart=TRUE;
}
void CMy24DianDlg::OnStart()
{
// TODO: Add your command handler code here
ShowEnterCtl();
m_bIsEnter=FALSE;
if(!m_bmpCard[0].LoadFromFile("bmp\\-1-10.bmp"))
{
AfxMessageBox("Can not load \"-1-10.bmp\"!");
}
InitCardInfo();
GetRand4();
CRect rc;
CStatic*pStatic=(CStatic*)GetDlgItem(IDC_CARD);
pStatic->GetWindowRect(rc);
ScreenToClient(rc);
InvalidateRect(rc,FALSE);
InvalidateRgn();
SetButtonEnabled();
m_bStart=TRUE;
}
void CMy24DianDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_bStart)
{
CRect rc;
CStatic*pStatic=(CStatic*)GetDlgItem(IDC_CARD);
pStatic->GetWindowRect(rc);
ScreenToClient(rc);
if(!m_bIsEnter && rc.PtInRect(point))
SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR_HAND));
else
SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
if(m_nCapturedCard>=0)
{
MoveCard(point, m_nCapturedCard);
}
if(m_nCapturedOp>=0)
{
MoveOp(point, m_nCapturedOp);
}
}
CDialog::OnMouseMove(nFlags, point);
}
void CMy24DianDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_bStart)
{
CRect rc;
CStatic*pStatic=(CStatic*)GetDlgItem(IDC_CARD);
pStatic->GetWindowRect(rc);
ScreenToClient(rc);
if(!m_bIsEnter && rc.PtInRect(point))
{
SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR_HAND));
GetRand4();
}
else
SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
if(!m_bIsEnter && m_nRestCount<=0)
{
if(!m_bmpCard[0].LoadFromFile("bmp\\-1-11.bmp"))
{
AfxMessageBox("Can not load \"-1-11.bmp\"!");
}
InvalidateRect(rc,FALSE);
}
m_nCapturedCard=CapturedCard(point);
m_nCapturedOp=CapturedOp(point);
m_ptDown=point;
}
CDialog::OnLButtonDown(nFlags, point);
}
void CMy24DianDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_bStart)
{
if(m_nCapturedCard>=0)
Snap(m_nCapturedCard);
if(m_nCapturedOp>=0)
Snap(m_nCapturedOp);
m_nCapturedCard=-1;
m_nCapturedOp=-1;
CRect rc;
CStatic*pStatic=(CStatic*)GetDlgItem(IDC_CARD);
pStatic->GetWindowRect(rc);
ScreenToClient(rc);
if(m_bStart && !m_bIsEnter && rc.PtInRect(point))
SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR_HAND));
else
SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
}
CDialog::OnLButtonUp(nFlags, point);
}
void CMy24DianDlg::ShowEnterCtl(BOOL bShow)
{
if(bShow)
{
for(int i=0; i<4; i++)
{
CComboBox*pCombo=(CComboBox*)GetDlgItem(IDC_COMBO_NUM1+i);
pCombo->ShowWindow(SW_SHOW);
}
}
else
{
for(int i=0; i<4; i++)
{
CComboBox*pCombo=(CComboBox*)GetDlgItem(IDC_COMBO_NUM1+i);
pCombo->ShowWindow(SW_HIDE);
}
}
}
void CMy24DianDlg::OnBackground()
{
// TODO: Add your command handler code here
char BASED_CODE szFilter[] ="Bitmap Files (*.bmp)|*.bmp||"; //"Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter,NULL);
if(dlg.DoModal()==IDOK)
{
if(!m_bmpBK.LoadFromFile(dlg.GetFileName()))
{
MessageBox("文件格式不對或不存在!","Stop",MB_ICONSTOP);
return;
}
Invalidate(FALSE);
}
}
CString CMy24DianDlg::IsRight(BOOL& bIsAgain)
{
// UpdateData(TRUE);
bIsAgain=TRUE;
CString strAnswer=m_strAnswer;
strAnswer.Replace("×", "*");
strAnswer.Replace("÷", "/");
if(strAnswer.IsEmpty())
{
MessageBox("不能為空!","信息",MB_ICONSTOP);
SetAnswerEditFocus();
return "FALSE";
}
CCalculate cal(strAnswer);
if(!cal.IsValid())
{
MessageBox("表達式有錯!","信息",MB_ICONSTOP);
SetAnswerEditFocus();
return "FALSE";
}
int nNumCount=NumCount(strAnswer);
if(nNumCount!=4)
{
MessageBox("數字個數不對!","信息",MB_ICONSTOP);
SetAnswerEditFocus();
return "FALSE";
}
if(!ContainNum(strAnswer))
{
MessageBox("不是指定的四個數!","信息",MB_ICONSTOP);
SetAnswerEditFocus();
return "FALSE";
}
double dResult=cal.GetResult();
if(dResult< atof(m_strResult)-0.001 || dResult>atof(m_strResult)+0.001)
{
bIsAgain=FALSE;
SetAnswerEditFocus();
// MessageBox("結果有錯!","信息",MB_ICONSTOP);
CString strWrongResult;
strWrongResult.Format("%.2f", dResult);
return strWrongResult;
}
return "";
}
int CMy24DianDlg::NumCount(const CString &strExp)
{
int nCount=0;
int len=strExp.GetLength();
for(int i=0; i<len; i++)
{
if(isdigit(strExp[i]))
nCount++;
while(i<len && isdigit(strExp[i]))
i++;
}
return nCount;
}
BOOL CMy24DianDlg::ContainNum(const CString &strExp)
{
CString strNum;
double num=0.0;
int nPos=0;
int len=strExp.GetLength();
double tmpNum[4];
BOOL bIsContain=FALSE;
for(int n=0; n<4; n++)
tmpNum[n]=m_dNum[n];
for(int i=0; i<len; i++)
{
if(isdigit(strExp[i]))
nPos=i;
else
continue;
while(i<len && isdigit(strExp[i]))
i++;
strNum=strExp.Mid(nPos,i-nPos);
num=atof(strNum);
bIsContain=FALSE;
for(int j=0; j<4; j++)
{
if(num==tmpNum[j])
{
tmpNum[j]=-1.0;
bIsContain=TRUE;
break;
}
}
if(!bIsContain)
return FALSE;
}
return TRUE;
}
void CMy24DianDlg::SetAnswerEditFocus()
{
CEdit*pEdit=(CEdit*)GetDlgItem(IDC_EDIT_ANSWER);
pEdit->SetFocus();
}
void CMy24DianDlg::OnAbout()
{
// TODO: Add your command handler code here
CAboutDlg dlg;
dlg.DoModal();
}
void CMy24DianDlg::InitPos()
{
CRect rc;
for(int i=0; i<5; i++)
{
InvalidateRect(m_rcCardPos[i],FALSE);
CStatic *pStatic=(CStatic*)GetDlgItem(IDC_CARD+i);
pStatic->GetWindowRect(rc);
ScreenToClient(rc);
m_rcCardPos[i]=rc;
}
for(i=0; i<21; i++)
{
InvalidateRect(m_rcOpPos[i],FALSE);
CStatic *pStatic=(CStatic*)GetDlgItem(IDC_OP_ADD+i/3);
pStatic->GetWindowRect(rc);
ScreenToClient(rc);
m_rcOpPos[i]=rc;
InvalidateRect(rc,FALSE);
}
}
void CMy24DianDlg::InitExpPos()
{
CRect rc;
for(int i=0; i<9; i++)
{
CStatic *pStatic=(CStatic*)GetDlgItem(IDC_EXP_OP_0+i);
pStatic->GetWindowRect(rc);
ScreenToClient(rc);
m_rcExpOpPos[i]=rc;
}
for(i=0; i<4; i++)
{
CStatic *pStatic=(CStatic*)GetDlgItem(IDC_EXP_CARD_0+i);
pStatic->GetWindowRect(rc);
ScreenToClient(rc);
m_rcExpCardPos[i]=rc;
}
}
void CMy24DianDlg::MoveCard(const CPoint& point, int nIndex)
{
CRect rcRange;
CStatic *pStatic=(CStatic*)GetDlgItem(IDC_STATIC_RANGE);
pStatic->GetWindowRect(rcRange);
ScreenToClient(rcRange);
CRect tmpRC=m_rcCardPos[nIndex];
tmpRC.OffsetRect(CPoint(point-m_ptDown));
if(!rcRange.PtInRect(tmpRC.TopLeft())
|| !rcRange.PtInRect(tmpRC.BottomRight()))
/* if(!rcRange.PtInRect(point))*/
return;
InvalidateRect(&m_rcCardPos[nIndex],FALSE);
m_rcCardPos[nIndex]=tmpRC;
InvalidateRect(&m_rcCardPos[nIndex],FALSE);
m_ptDown=point;
// Snap(nIndex);
}
void CMy24DianDlg::MoveOp(const CPoint &point, int nIndex)
{
CRect rcRange;
CStatic *pStatic=(CStatic*)GetDlgItem(IDC_STATIC_RANGE);
pStatic->GetWindowRect(rcRange);
ScreenToClient(rcRange);
CRect tmpRC=m_rcOpPos[nIndex];
tmpRC.OffsetRect(CPoint(point-m_ptDown));
if(!rcRange.PtInRect(tmpRC.TopLeft())
|| !rcRange.PtInRect(tmpRC.BottomRight()))
/* if(!rcRange.PtInRect(point))*/
return;
InvalidateRect(&m_rcOpPos[nIndex],FALSE);
m_rcOpPos[nIndex]=tmpRC;
InvalidateRect(&m_rcOpPos[nIndex],FALSE);
m_ptDown=point;
// Snap(nIndex);
}
int CMy24DianDlg::CapturedCard(const CPoint &point)
{
for(int i=4; i>0; i--)
{
if(m_rcCardPos[i].PtInRect(point))
return i;
}
return -1;
}
int CMy24DianDlg::CapturedOp(const CPoint &point)
{
for(int i=20; i>=0; i--)
{
if(m_rcOpPos[i].PtInRect(point))
return i;
}
return -1;
}
void CMy24DianDlg::Snap(int nIndex)
{
if(m_nCapturedCard >= 0)
{
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -