?? 24diandlg.cpp
字號:
// 24DianDlg.cpp : implementation file
//
#include "stdafx.h"
#include "24Dian.h"
#include "24DianDlg.h"
#include <stdlib.h>
#include "expression.h"
#include "calculate.h"
#include "HelpDlg.h"
#include "HyperLink.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
CHyperLink m_AuthorMail;
CHyperLink m_CoLink;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
virtual BOOL OnInitDialog();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
DDX_Control(pDX, IDC_STATIC_AUTHOR, m_AuthorMail);
DDX_Control(pDX, IDC_STATIC_LINK, m_CoLink);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMy24DianDlg dialog
CMy24DianDlg::CMy24DianDlg(UINT nIDD, CWnd* pParent /*=NULL*/)
: CDialog(/*CMy24DianDlg::IDD*/nIDD, pParent)
{
//{{AFX_DATA_INIT(CMy24DianDlg)
m_strResult = _T("24");
m_strNum1 = _T("1");
m_strNum2 = _T("1");
m_strNum3 = _T("1");
m_strNum4 = _T("1");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMy24DianDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMy24DianDlg)
DDX_Control(pDX, IDC_COMBO_NUM1, m_ctlComboNum1);
DDX_Control(pDX, IDC_COMBO_NUM4, m_ctlComboNum4);
DDX_Control(pDX, IDC_COMBO_NUM3, m_ctlComboNum3);
DDX_Control(pDX, IDC_COMBO_NUM2, m_ctlComboNum2);
DDX_Control(pDX, IDC_COMBO_RESULT, m_ctlComboResult);
DDX_CBString(pDX, IDC_COMBO_RESULT, m_strResult);
DDX_CBString(pDX, IDC_COMBO_NUM1, m_strNum1);
DDX_CBString(pDX, IDC_COMBO_NUM2, m_strNum2);
DDX_CBString(pDX, IDC_COMBO_NUM3, m_strNum3);
DDX_CBString(pDX, IDC_COMBO_NUM4, m_strNum4);
//}}AFX_DATA_MAP
/* DDX_CBString(pDX, IDC_COMBO_NUM1, m_strNum[0]);
DDX_CBString(pDX, IDC_COMBO_NUM2, m_strNum[1]);
DDX_CBString(pDX, IDC_COMBO_NUM3, m_strNum[2]);
DDX_CBString(pDX, IDC_COMBO_NUM4, m_strNum[3]);*/
}
BEGIN_MESSAGE_MAP(CMy24DianDlg, CDialog)
//{{AFX_MSG_MAP(CMy24DianDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_ANSWER, OnButtonAnswer)
ON_UPDATE_COMMAND_UI(ID_ENTER_NUM, OnUpdateEnterNum)
ON_COMMAND(ID_ENTER_NUM, OnEnterNum)
ON_COMMAND(ID_START, OnStart)
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_COMMAND(ID_BACKGROUND, OnBackground)
ON_COMMAND(ID_ABOUT, OnAbout)
ON_CBN_SELCHANGE(IDC_COMBO_NUM1, OnSelchangeComboNum1)
ON_CBN_EDITCHANGE(IDC_COMBO_NUM1, OnEditchangeComboNum1)
ON_CBN_EDITCHANGE(IDC_COMBO_NUM2, OnEditchangeComboNum2)
ON_CBN_SELCHANGE(IDC_COMBO_NUM2, OnSelchangeComboNum2)
ON_CBN_EDITCHANGE(IDC_COMBO_NUM3, OnEditchangeComboNum3)
ON_CBN_SELCHANGE(IDC_COMBO_NUM3, OnSelchangeComboNum3)
ON_CBN_EDITCHANGE(IDC_COMBO_NUM4, OnEditchangeComboNum4)
ON_CBN_SELCHANGE(IDC_COMBO_NUM4, OnSelchangeComboNum4)
ON_BN_CLICKED(IDC_BUTTON_NO_ANSWER, OnButtonNoAnswer)
ON_BN_CLICKED(IDC_BUTTON_ALL_ANSWER, OnButtonAllAnswer)
ON_BN_CLICKED(IDC_BUTTON_NEXT_ANSWER, OnButtonNextAnswer)
ON_COMMAND(ID_HELP, OnHelp)
ON_CBN_EDITCHANGE(IDC_COMBO_RESULT, OnEditchangeComboResult)
ON_CBN_SELCHANGE(IDC_COMBO_RESULT, OnSelchangeComboResult)
ON_UPDATE_COMMAND_UI(ID_START, OnUpdateStart)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMy24DianDlg message handlers
BOOL CMy24DianDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
if(!m_bmpCard[1].LoadFromFile("bmp\\-1-09.bmp"))
{
AfxMessageBox("Can not load \"-1-09.bmp\"!");
exit(1);
}
m_bmpCard[2].LoadFromFile("bmp\\-1-09.bmp");
m_bmpCard[3].LoadFromFile("bmp\\-1-09.bmp");
m_bmpCard[4].LoadFromFile("bmp\\-1-09.bmp");
if(!m_bmpCard[0].LoadFromFile("bmp\\-1-10.bmp"))
{
AfxMessageBox("Can not load \"-1-10.bmp\"!");
}
if(!m_bmpBK.LoadFromFile("BK\\bk.bmp"))
{
AfxMessageBox("Can not load \"bk.bmp\"!");
}
CRect rc;
CStatic* pStatic=(CStatic*)GetDlgItem(IDC_STATIC_ANSWER);
pStatic->GetWindowRect(rc);
ScreenToClient(rc);
m_ctlEditAnswer.Create(WS_VISIBLE |ES_LEFT| WS_CHILD | WS_BORDER, rc, this, IDC_EDIT_ANSWER);
pStatic=(CStatic*)GetDlgItem(IDC_STATIC_ANSWERLIST);
pStatic->GetWindowRect(rc);
ScreenToClient(rc);
m_ctlEditAnswerList.Create(WS_VISIBLE|WS_VSCROLL|ES_MULTILINE | ES_LEFT| WS_CHILD | WS_BORDER,
rc,
this,
IDC_EDIT_ANSWER_LIST);
// m_ctlEditAnswerList.SubclassDlgItem(IDC_EDIT1, this);
SetAnswerList();
SetComboBox();
m_bIsEnter=FALSE;
m_nCapturedCard=-1;
m_nCapturedOp=-1;
m_nAnswerIndex=0;
m_bStart=FALSE;
InitCardInfo();
InitPos();
InitExpPos();
ShowEnterCtl();
srand( (unsigned)time( NULL ) );
ShowWindow(SW_SHOWMAXIMIZED);
return TRUE; // return TRUE unless you set the focus to a control
}
void CMy24DianDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CMy24DianDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
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;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CPaintDC dc(this);
CDC cdc;
CDC* pDrawDC = &dc;
CBitmap bitmap;
CBitmap* pOldBitmap;//背景的位圖
// only paint the rect that needs repainting
CRect rect;
GetClientRect(rect);
if (!dc.IsPrinting())
{
// draw to offscreen bitmap for fast looking repaints
if (cdc.CreateCompatibleDC(&dc))
{
if (bitmap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height()))
{
// OnPrepareDC(&cdc, NULL);
pDrawDC = &cdc;
// offset origin more because bitmap is just piece of the whole drawing
// cdc.OffsetViewportOrg(-rect.left, -rect.top);
pOldBitmap = cdc.SelectObject(&bitmap);
// cdc.SetBrushOrg(rect.left % 8, rect.top % 8);
// might as well clip to the same rectangle
// cdc.IntersectClipRect(client);
}
}
}
/* m_bmpBK.DrawTile(dc,&rect);
DrawLabel(&dc);
DrawExpPos(&dc);
if(!m_bIsEnter)
{
for(int i=0; i<5; i++)
m_bmpCard[i].Draw(dc,&m_rcCardPos[i]);
}
else
{
DrawNum(&dc);
}
DrawOp(&dc);
*/
// dc.FillRect(rect, &CBrush(RGB(255,255,255)));
m_bmpBK.DrawTile(*pDrawDC,&rect);
DrawLabel(pDrawDC);
DrawExpPos(pDrawDC);
if(!m_bIsEnter)
{
for(int i=0; i<5; i++)
m_bmpCard[i].Draw(*pDrawDC,&m_rcCardPos[i]);
}
else
{
DrawNum(pDrawDC);
}
DrawOp(pDrawDC);
if (pDrawDC != &dc)
{
dc.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),
&cdc, 0, 0, SRCCOPY);
}
dc.SelectObject(pOldBitmap);
CDialog::OnPaint();
}
// TRACE("Paint!!\n");
}
void CMy24DianDlg::DrawOp(CDC *pDC)
{
ASSERT(pDC);
for(int i=0; i<21; i++)
{
CDC compDC;
compDC.CreateCompatibleDC(NULL);
// 設置目標DC的拉伸模式為STRETCH_DELETESCANS,也就是不顯示拉伸掉的圖像
int srlold = pDC->SetStretchBltMode(STRETCH_DELETESCANS);
CBitmap bmp;
if(bmp.LoadBitmap(IDB_BITMAP_ADD+i/3)==0)
break;
BITMAP bitmap;
if(bmp.GetBitmap(&bitmap)==0)
break;
CBitmap* pPreBmp=compDC.SelectObject(&bmp);
pDC->StretchBlt(m_rcOpPos[i].left+2,
m_rcOpPos[i].top+2,
m_rcOpPos[i].Width()-2,
m_rcOpPos[i].Height()-2,
&compDC,
0,
0,
bitmap.bmWidth,
bitmap.bmHeight,
SRCCOPY);
// 恢復設備描述表原來的設置
compDC.SelectObject(pPreBmp);
bmp.DeleteObject();
pDC->SetStretchBltMode(srlold);
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CMy24DianDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CMy24DianDlg::InitCardInfo()
{
m_nRestCount=52;
CString strTmp;
int n=0;
for(int i=0; i<4; i++)
m_dNum[i]=1;
for(i=0; i<4; i++)
{
for(int j=0; j<13; j++)
{
strTmp.Format("%c",'0'+i);
if(j<9)
strTmp.Format(strTmp+"-0"+"%d.bmp",j+1);
else
strTmp.Format(strTmp+"-"+"%d.bmp",j+1);
m_CardInfo[n].m_strFileName=strTmp;
m_CardInfo[n].m_nNum=j+1;
n++;
}
}
/* for(i=0; i<52; i++)
TRACE(m_CardInfo[i].m_strFileName+",%d\n",m_CardInfo[i].m_nNum);*/
}
void CMy24DianDlg::GetRand4()
{
m_strAnswerList="";
m_nAnswerIndex=0;
InitPos();
if(m_nRestCount<=0)
{
if(!m_bmpCard[0].LoadFromFile("bmp\\-1-11.bmp"))
{
AfxMessageBox("Can not load \"-1-11.bmp\"!");
}
if(MessageBox("是否重新開局?","是否開局?",MB_YESNO | MB_ICONQUESTION)==IDYES)
{
if(!m_bmpCard[0].LoadFromFile("bmp\\-1-10.bmp"))
{
AfxMessageBox("Can not load \"-1-10.bmp\"!");
}
InitCardInfo();
Invalidate(FALSE);
}
else
{
return;
}
}
// CString strTmp;
int nRand;
for(int i=0; i<4; i++)
{
nRand=rand()%(m_nRestCount);
SetCard(i,nRand);
// strTmp.Format("%d",nRand);
// MessageBox(strTmp);
}
// m_nRestCount-=4;
InvalidateRgn();
}
void CMy24DianDlg::SetCard(int nCard,int nIndex)
{
int n=-1;
for(int i=0; i<52; i++)
{
if(!m_CardInfo[i].m_strFileName.IsEmpty())
{
n++;
}
if(n==nIndex)
{
switch(nCard)
{
case 0:
if(!m_bmpCard[1].LoadFromFile("bmp\\"+m_CardInfo[i].m_strFileName))
AfxMessageBox("Can not load BMP:\""+m_CardInfo[i].m_strFileName+"\"");
m_CardInfo[i].m_strFileName="";
m_dNum[0]=m_CardInfo[i].m_nNum;
m_nRestCount--;
break;
case 1:
if(!m_bmpCard[2].LoadFromFile("bmp\\"+m_CardInfo[i].m_strFileName))
AfxMessageBox("Can not load BMP:\""+m_CardInfo[i].m_strFileName+"\"");
m_CardInfo[i].m_strFileName="";
m_dNum[1]=m_CardInfo[i].m_nNum;
m_nRestCount--;
break;
case 2:
if(!m_bmpCard[3].LoadFromFile("bmp\\"+m_CardInfo[i].m_strFileName))
AfxMessageBox("Can not load BMP:\""+m_CardInfo[i].m_strFileName+"\"");
m_CardInfo[i].m_strFileName="";
m_dNum[2]=m_CardInfo[i].m_nNum;
m_nRestCount--;
break;
case 3:
if(!m_bmpCard[4].LoadFromFile("bmp\\"+m_CardInfo[i].m_strFileName))
AfxMessageBox("Can not load BMP:\""+m_CardInfo[i].m_strFileName+"\"");
m_CardInfo[i].m_strFileName="";
m_dNum[3]=m_CardInfo[i].m_nNum;
m_nRestCount--;
break;
}
break;
}
else if(i==51)
AfxMessageBox("There are something wrong!");
}
}
void CMy24DianDlg::InvalidateRgn()
{
CRect rc;
CStatic*pStatic=(CStatic*)GetDlgItem(IDC_CARD1);
pStatic->GetWindowRect(rc);
ScreenToClient(rc);
InvalidateRect(rc,FALSE);
pStatic=(CStatic*)GetDlgItem(IDC_CARD2);
pStatic->GetWindowRect(rc);
ScreenToClient(rc);
InvalidateRect(rc,FALSE);
pStatic=(CStatic*)GetDlgItem(IDC_CARD3);
pStatic->GetWindowRect(rc);
ScreenToClient(rc);
InvalidateRect(rc,FALSE);
pStatic=(CStatic*)GetDlgItem(IDC_CARD4);
pStatic->GetWindowRect(rc);
ScreenToClient(rc);
InvalidateRect(rc,FALSE);
}
void CMy24DianDlg::OnButtonAnswer()
{
// TODO: Add your control notification handler code here
UpdateData();
if(m_strAnswerList=="無解!")
{
MessageBox("答案不正確!","信息",MB_ICONINFORMATION);
return;
}
BOOL bIsAgain=FALSE;
m_ctlEditAnswer.GetWindowText(m_strAnswer);
if(!m_strAnswerList.IsEmpty())
{
CString strCalResult = IsRight(bIsAgain);
if(strCalResult.IsEmpty())//!m_bSolution &&
MessageBox("答案正確!","信息",MB_ICONINFORMATION);
else
{
if(bIsAgain)
return;
if(strCalResult == "FALSE")
MessageBox("答案不正確!","信息",MB_ICONINFORMATION);
else
MessageBox("答案不正確!\n你輸入的表達式的運算結果為:"+strCalResult,"信息",MB_ICONINFORMATION);
}
return;
}
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("/","÷");
bIsAgain=FALSE;
CString strCalResult = IsRight(bIsAgain);
if(strCalResult.IsEmpty())//!m_bSolution &&
MessageBox("答案正確!","信息",MB_ICONINFORMATION);
else
{
if(bIsAgain)
return;
if(strCalResult == "FALSE")
MessageBox("答案不正確!","信息",MB_ICONINFORMATION);
else
MessageBox("答案不正確!\n你輸入的表達式的運算結果為:"+strCalResult,"信息",MB_ICONINFORMATION);
}
}
else
{
m_strAnswerList="無解!";
MessageBox("答案不正確!","信息",MB_ICONINFORMATION);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -