📄 24pointsdlg.cpp
字号:
rect.right=m_SymbolRect[m_index].right+1;
rect.top=m_SymbolRect[m_index].top;
rect.bottom=m_SymbolRect[m_index].bottom+1;
if(symPreRect!=rect)
{
if(!symPreRect.IsRectEmpty())
InvalidateRect(symPreRect);
InvalidateRect(rect);
symPreRect=rect;
}
}
else if(!symPreRect.IsRectEmpty())
{
InvalidateRect(symPreRect);
symPreRect.SetRectEmpty();
}
if(!m_mouseDown)
{//鼠标进入那个对象区域
CRect tmpRect(0,0,0,0);
for(i=1;i<m_objArray.GetSize();i++)
{
node*p=(node*)m_objArray.GetAt(i);
if(p->m_rect.PtInRect(point))
{
p->m_mouse_in=1;
tmpRect.left=p->m_rect.left-1;
tmpRect.top=p->m_rect.top-1;
tmpRect.right=p->rc.right +1;
tmpRect.bottom=p->m_rect.bottom+1;
}
else
p->m_mouse_in=0;
}
if(objPreRect!=tmpRect)
{
if(!objPreRect.IsRectEmpty())
InvalidateRect(objPreRect);
if(!tmpRect.IsRectEmpty())
InvalidateRect(tmpRect);
objPreRect=tmpRect;
}
}
if(m_mouseDown)
{
::SetCursor(m_HCursor);
int i;
for(i=0;i<m_objArray.GetSize();i++)
{
node*p=(node*)m_objArray.GetAt(i);
CRect rect=p->m_rect;
rect+=CSize(5,0);
if(rect.PtInRect(point)&&strGot.GetLength())
p->m_hit=1;
else
p->m_hit=0;
}
if(strGot.GetLength()||m_index<6)
{
CRect rect=GetFormulaRect();
if(rect.PtInRect(point))
InvalidateRect(rect);
}
}
CDialog::OnMouseMove(nFlags, point);
}
void CMy24pointsDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
m_mouseDown=FALSE;
m_HCursor=AfxGetApp()->LoadStandardCursor(IDC_ARROW);
if(strGot.GetLength())
{
node*p=new node;
strcpy(p->m_str,strGot.GetBuffer(strGot.GetLength()));
if(!Add(p,point))
{
delete p;
cards.m_index_set.erase(m_card_index);
}
else if(m_card_index>-1)
{
cards.m_index_set.insert(m_card_index);
p->oriIndex=m_card_index;
}
}
if(!symPreRect.IsRectEmpty())
InvalidateRect(symPreRect);
cards.Draw(&dc,m_TLP,m_shuffle);
InvalidateRect(CRect(10,150,230,180));
CDialog::OnLButtonUp(nFlags, point);
}
void CMy24pointsDlg::DrawSyms(CDC *pDC)
{
CBitmap bitmap;
CDC memDC;
CBitmap*oldBitmap;
int bmWidth=30,bmHeight=30;
bitmap.LoadBitmap(IDB_ADD);
memDC.CreateCompatibleDC(pDC);
oldBitmap=memDC.SelectObject(&bitmap);
memDC.BitBlt(0,0,bmWidth,bmHeight,&memDC,0,0,SRCCOPY);
pDC->BitBlt(m_SymbolRect[0].left,m_SymbolRect[0].top,bmWidth,bmHeight,&memDC,0,0,SRCAND);
bitmap.DeleteObject();
int i=0;
for(i=1;i<6;i++)
{
bitmap.LoadBitmap(IDB_ADD+i);
memDC.SelectObject(&bitmap);
memDC.BitBlt(0,0,bmWidth,bmHeight,&memDC,0,0,SRCCOPY);
pDC->BitBlt(m_SymbolRect[i].left,m_SymbolRect[i].top,bmWidth,bmHeight,&memDC,0,0,SRCAND);
bitmap.DeleteObject();
}
pDC->SelectObject(oldBitmap);
}
void CMy24pointsDlg::OnOK()
{
// TODO: Add extra validation here
m_shuffle=TRUE;
cards.m_index_set.clear();
while(m_objArray.GetSize()>1)
{
node*p=(node*)m_objArray.GetAt(1);
m_objArray.RemoveAt(1);
delete p;
}
CStatic*pStatic=(CStatic*)GetDlgItem(IDC_STATIC_RESULT);
pStatic->SetWindowText("");
SetTimer(2,m_maxElapse,NULL);
m_lapse=0;
CButton*pbut=(CButton*)GetDlgItem(IDC_SHOE_EXPRESSION);
pbut->EnableWindow();
pbut=(CButton*)GetDlgItem(IDC_RE_DO);
pbut->EnableWindow();
pbut=(CButton*)GetDlgItem(IDC_SUBMIT);
pbut->EnableWindow();
CClientDC dc(this);
cards.Draw(&dc,m_TLP,m_shuffle);
InvalidateRect(GetFormulaRect());
m_operators=0;
}
void CMy24pointsDlg::DrawFormula(CDC *pDC, CPoint point)
{
int i;
node*p=(node*)m_objArray.GetAt(0);
p->Draw(pDC);
for(i=1;i<m_objArray.GetSize();i++)
{
node*pp=(node*)m_objArray.GetAt(i);
pp->m_rect.left=p->m_rect.right;
pp->Draw(pDC);
p=pp;
}
}
BOOL CMy24pointsDlg::Add(node *p, CPoint point,BOOL AtTail)
{
if(hitNode&&hitNode->m_rect.PtInRect(point))
return FALSE;
BOOL bRet=FALSE;
int i=0;
int num=m_objArray.GetSize();
node*pp=0;
for(i=0;i<num;i++)
{
pp=(node*)m_objArray.GetAt(i);
CRect rect=pp->m_rect;
rect+=CSize(5,0);
if(rect.PtInRect(point))
{
pp->m_hit=0;
break;
}
}
if(pp&&i<num)
{
p->m_rect.left=pp->m_rect.right;
p->m_rect.top=pp->m_rect.top;
m_objArray.InsertAt(i+1,p);
bRet=TRUE;
}
else if(AtTail)
{
m_objArray.Add(p);
bRet=TRUE;
}
if(hitNode)
{
for(i=0;i<m_objArray.GetSize();i++)
{
if(hitNode==(node*)m_objArray.GetAt(i))
break;
}
if(i<m_objArray.GetSize())
m_objArray.RemoveAt(i);
if(!bRet)
{
cards.m_index_set.erase(hitNode->oriIndex);
if(IsOperator(hitNode->m_str[0]))
m_operators--;
}
else
p->oriIndex=hitNode->oriIndex;
delete hitNode;
hitNode=0;
}
else if(bRet&&IsOperator(p->m_str[0]))
m_operators++;
return bRet;
}
void CMy24pointsDlg::OnReDo()
{
// TODO: Add your control notification handler code here
cards.m_index_set.clear();
while(m_objArray.GetSize()>1)
{
node*p=(node*)m_objArray.GetAt(1);
m_objArray.RemoveAt(1);
delete p;
}
CStatic*pStatic=(CStatic*)GetDlgItem(IDC_STATIC_RESULT);
pStatic->SetWindowText("");
m_operators=0;
Invalidate();
}
void CMy24pointsDlg::OnSubmit()
{
// TODO: Add your control notification handler code here
CParse parse;
char str[255]={0};
int i;
for(i=1;i<m_objArray.GetSize();i++)
{
node*p=(node*)m_objArray.GetAt(i);
strcat(str,p->m_str);
}
std::vector<char*> error_str;
int num=parse.ExpressionReduce(str);
parse.get_error_info(error_str);
char result[255]={0};
if(error_str.size())
{
std::vector<char*>::iterator it=error_str.begin();
while(it!=error_str.end())
{
strcat(result,*it);
it++;
}
}
else
sprintf(result,"%s=%d",str,num);
CStatic*pStatic=(CStatic*)GetDlgItem(IDC_STATIC_RESULT);
pStatic->SetWindowText(result);
if(num==24&&cards.m_index_set.size()==4&&m_operators==3)
KillTimer(2);
}
void CMy24pointsDlg::OnShoeExpression()
{
// TODO: Add your control notification handler code here
CString str;
cards.GetResult(str);
CStatic*pStatic=(CStatic*)GetDlgItem(IDC_STATIC_RESULT);
pStatic->SetWindowText(str);
SetTimer(1,200,NULL);
}
CRect CMy24pointsDlg::GetFormulaRect()
{
CRect rect=((node*)m_objArray.GetAt(0))->rc;
// int num=m_objArray.GetSize();
rect.right+=200;//((node*)m_objArray.GetAt(num-1))->rc.right;
return rect;
}
void CMy24pointsDlg::DrawProgress(CStatic *pStatic)
{
CDC*pDC=pStatic->GetDC();
CRect rect;
pStatic->GetClientRect(&rect);
double value=rect.Width();
value/=60;
CRect rc=rect;
rc.right=rc.left+value*m_lapse;
pDC->Rectangle(&rect);
pDC->FillRect(rc,&CBrush(RGB(255,0,0)));
pStatic->ReleaseDC(pDC);
}
void CMy24pointsDlg::OnCancel()
{
/* for(int i=0;i<m_objArray.GetSize();i++)
delete (node*)m_objArray.GetAt(i);
m_objArray.RemoveAll();*/
CDialog::OnCancel();
}
CRect CMy24pointsDlg::GetCardsRect(int index)
{
int width=71;
CRect rect[4]={CRect(m_TLP.x,m_TLP.y,m_TLP.x+71,m_TLP.y+96),
CRect(m_TLP.x+width+2,m_TLP.y,m_TLP.x+2*width+2,m_TLP.y+96),
CRect(m_TLP.x+2*width+4,m_TLP.y,m_TLP.x+3*width+4,m_TLP.y+96),
CRect(m_TLP.x+3*width+6,m_TLP.y,m_TLP.x+4*width+6,m_TLP.y+96)};
if(index>=0&&index<4)
return rect[index];
else
return CRect(0,0,0,0);
}
void CMy24pointsDlg::OnDestroy()
{
CDialog::OnDestroy();
for(int i=0;i<m_objArray.GetSize();i++)
delete (node*)m_objArray.GetAt(i);
m_objArray.RemoveAll();
}
BOOL CMy24pointsDlg::IsOperator(char ch)
{
BOOL bRet=(ch=='+');
bRet|=(ch=='-');
bRet|=(ch=='*');
bRet|=(ch=='/');
return bRet;
}
void CMy24pointsDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_card_index=-1;
strGot="";
int i;
for(i=0;i<4;i++)
{
if(cards.m_index_set.find(i)!=cards.m_index_set.end())
continue;
if(GetCardsRect(i).PtInRect(point))
{
int num=cards.m_deck[cards.m_got_cards[i]].point-IDB_DIAMAND_02+1;
if(num==13)
num=0;
strGot.Format("%d",num+1);
node*p=new node;
strcpy(p->m_str,strGot.GetBuffer(strGot.GetLength()));
CRect rect=((node*)m_objArray.GetAt(m_objArray.GetSize()-1))->m_rect;
p->m_rect.top=rect.top;
p->m_rect.left=rect.right;
p->oriIndex=i;
m_objArray.Add(p);
cards.m_index_set.insert(i);
break;
}
}
if(strGot.GetLength()==0)
{
for(i=0;i<6;i++)
{
if(m_SymbolRect[i].PtInRect(point))
{
char s[]="+-*/()";
strGot.Insert(0,s[i]);
node*p=new node;
strcpy(p->m_str,strGot.GetBuffer(strGot.GetLength()));
CRect rect=((node*)m_objArray.GetAt(m_objArray.GetSize()-1))->m_rect;
p->m_rect.top=rect.top;
p->m_rect.left=rect.right;
m_objArray.Add(p);
if(IsOperator(p->m_str[0]))
m_operators++;
break;
}
}
}
CDialog::OnLButtonDblClk(nFlags, point);
}
BOOL CAboutDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: 在此添加额外的初始化
CStatic*p=new CStatic;
p->Create("周云才设计",WS_CHILD|WS_VISIBLE,CRect(55,10,260,30),this);
p->ShowWindow(SW_SHOW);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -