// scDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "sc.h"
#include "scDlg.h"
#include ".\scdlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
// CscDlg 对话框
CscDlg::CscDlg(CWnd* pParent /*=NULL*/)
: CDialog(CscDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_strXin="a!dAA1$%^&IKMJNSD98574PO";
m_llNumber1=13693;
m_llNumber2=113;
}
void CscDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_COMBO1, m_GameNumber);
CString strTitle;
strTitle.Format("数字3趣味游戏上分码计算");
SetWindowText(strTitle);
((CEdit*)GetDlgItem(IDC_EDIT_RANDOM))->SetLimitText(15);
((CEdit*)GetDlgItem(IDC_EDIT_ADDSCORE))->SetLimitText(7);
((CEdit*)GetDlgItem(IDC_EDIT_ADDGAME))->SetLimitText(5);
}
BEGIN_MESSAGE_MAP(CscDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDOK, OnBnClickedOk)
ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
ON_CBN_SELCHANGE(IDC_COMBO1, OnCbnSelchangeCombo1)
END_MESSAGE_MAP()
// CscDlg 消息处理程序
BOOL CscDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 将\“关于\”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
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);
}
}
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
InitGameName();
CFont * Font;
Font = new CFont;
Font->CreateFont(
16, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
FW_BOLD, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
DEFAULT_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH|FF_SWISS, // nPitchAndFamily
"黑体");
GetDlgItem(IDC_COMBO1)->SetFont(Font);
GetDlgItem(IDC_EDIT_RANDOM)->SetFont(Font);
GetDlgItem(IDC_EDIT_ADDSCORE)->SetFont(Font);
GetDlgItem(IDC_EDIT_ADDGAME)->SetFont(Font);
GetDlgItem(IDC_EDIT_ADDNUMBER)->SetFont(Font);
return TRUE; // 除非设置了控件的焦点,否则返回 TRUE
}
void CscDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
/*CAboutDlg dlgAbout;
dlgAbout.DoModal();*/
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CscDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作矩形中居中
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;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR CscDlg::OnQueryDragIcon()
{
return static_cast(m_hIcon);
}
void CscDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
//OnOK();
if(!Validation())
{
return;
}
ShowSYInfo();
GetNumber();
}
void CscDlg::GetNumber()
{
GetDlgItemText(IDC_EDIT_RANDOM,m_strRandom);
GetDlgItemText(IDC_EDIT_ADDSCORE,m_strAddscore);
GetDlgItemText(IDC_EDIT_ADDGAME,m_strGame);
GetDlgItemText(IDC_EDIT_ADDNUMBER,m_strAddNumber);
if(m_strRandom=="")
{
AfxMessageBox("随机码不能为空");
return;
}
//1上分,2加场
//DMD5(MD5(分+随)+K,10)+DMD5(MD5(局+随)+K,10),后第4位是type,奇为上分,2为加场,0为两个都加
CString strKey=m_strArea+m_strXin;
LONGLONG llAddScore=_atoi64(m_strAddscore);
LONGLONG llAddGame=_atoi64(m_strGame);
if(llAddScore%100!=0)
{
AfxMessageBox("请输入100的倍数");
return;
}
if(llAddScore==0&&llAddGame==0)
{
AfxMessageBox("分数和局数不能全为0");
return;
}
if(llAddScore>5000000)
{
AfxMessageBox("分数不能超过5000000");
return;
}
if(llAddGame>50000)
{
AfxMessageBox("场数不能超过50000");
return;
}
if(m_strRandom.GetLength()!=15)
{
AfxMessageBox("请输入15位的随机码");
return;
}
LONGLONG llRandom=_atoi64(m_strRandom);
CString str1,str2,str3,str4,strTotal;
str1.Format("%015I64u",llRandom+llAddScore);
str1=MD5(str1)+strKey;
str1=DigitalMD5(str1,10);
str2.Format("%015I64u",llRandom+llAddGame);
str2=MD5(str2)+strKey;
str2=DigitalMD5(str2,10);
if(llAddScore>0&&llAddGame<=0)
{
CString strT;
str2=str2.Left(6)+"1"+str2.Right(3);
}
else if(llAddScore<=0&&llAddGame>0)
{
CString strT;
str2=str2.Left(6)+"2"+str2.Right(3);
}
else
{
str2=str2.Left(6)+"0"+str2.Right(3);
}
m_strAddNumber=str1+str2;
SetDlgItemText(IDC_EDIT_ADDNUMBER,m_strAddNumber);
//UpdateWindow();
}
CString CscDlg::MD5(CString str)
{
TCHAR sz[33];
CString strmd5;
CMD5Encrypt::EncryptData(str,sz);
strmd5=sz;
return strmd5;
}
CString CscDlg::DigitalMD5(CString str,int Right)
{
CString strNumber;
CString strMD5=MD5(str);
static CRegexpT regexp("[:^digit:]");
char *a=regexp.Replace(strMD5,"");
strNumber=a;
regexp.ReleaseString(a);
if(Right!=0)
{
Right=min(strNumber.GetLength(),Right);
strNumber=strNumber.Right(Right);
LONGLONG llNumber=_atoi64(strNumber);
strNumber.Format("%010I64u",llNumber);
if(strNumber.GetLength()>Right)
{
strNumber.Right(Right);
}
}
return strNumber;
}
void CscDlg::Search(CStringArray& dest)
{
dest.RemoveAll();
SHFILEINFO sfi;
CFileFind* fileFind=new CFileFind();
BOOL res = fileFind->FindFile("*.liu");
int i=0;
while(res)
{
res = fileFind->FindNextFile();
if(fileFind->IsDirectory())
{
continue;
}
SHGetFileInfo(fileFind->GetFilePath(),0,&sfi,sizeof(sfi),SHGFI_ICON);
dest.Add(fileFind->GetFileTitle());
i++;
}
}
void CscDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
if(OpenClipboard())//打开剪切板
{
EmptyClipboard();//清空剪切板,让当前窗口进程拥有剪切板
CString Str;
GetDlgItemText(IDC_EDIT_ADDNUMBER,Str);//获取数据
HANDLE hClip;
hClip=GlobalAlloc(GMEM_MOVEABLE,Str.GetLength()+1);//分配内存对象返回地址(该函数是系统从全局堆中分配内存)
char *pBuf;
pBuf=(char *)GlobalLock(hClip);//锁定全局内存中指定的内存块,并返回一个地址值,令其指向内存块的起始处
strcpy(pBuf,Str);//将Str对象中的数据Copy到内存空间中
GlobalUnlock(hClip);//解锁全局内存块
SetClipboardData(CF_TEXT,hClip);//设置剪贴板数据
CloseClipboard();//关闭
}
}
void CscDlg::InitGameName()
{
Search(m_strArrFileName);
int nCount=m_strArrFileName.GetCount();
for(int i=0;i<nCount;i++)
{
m_GameNumber.AddString(_T(m_strArrFileName.GetAt(i)));
}
m_GameNumber.SetCurSel(0);
int nIndex=m_GameNumber.GetCurSel();
m_strArea=m_strArrFileName.GetAt(nIndex);
CString strFile=m_strArea+".liu";
OnOpenDocument(strFile);
}
void CscDlg::OnCbnSelchangeCombo1()
{
// TODO: 在此添加控件通知处理程序代码
int nIndex=m_GameNumber.GetCurSel();
m_strArea=m_strArrFileName.GetAt(nIndex);
CString strFile=m_strArea+".liu";
OnOpenDocument(strFile);
}
BOOL CscDlg::OnOpenDocument(CString strFileName)
{
CStdioFile file;
CString filePathName;
int row;
CString result;
CString strLine,strTemp;
row = 0;
file.Open(strFileName,CFile::modeRead);
while(file.ReadString(strLine))
{
char *str = strLine.GetBufferSetLength(strLine.GetLength());
char *p;
if(strLine!="")
{
for (p=strtok(str,";");p!=NULL;p=strtok(NULL,";"))
{
strTemp = p;
result+=strTemp;
}
row ++;
}
}
m_MD5File=result;
return TRUE;
}
BOOL CscDlg::Validation()
{
//DMD5(MD5(机器号+AB)+m_strXin,10)+DMD5(m_strXin+机器号,10)
CString strOK=DigitalMD5(MD5(m_strArea+"AB")+m_strXin,10)+DigitalMD5(m_strXin+m_strArea,10);
//AfxMessageBox(strOK);
if(strOK!=m_MD5File)
{
return FALSE;
}
else
{
return TRUE;
}
}
BOOL CscDlg::ShowSYInfo()
{
CString strInfo;
CString strRandom,strScore,strInnings;
GetDlgItemText(IDC_EDIT_RANDOM,strRandom);
strScore=(strRandom.Left(9)).Right(8);
strInnings=(strRandom.Right(6)).Right(5);
int nScoreWei=atoi((strRandom.Left(9)).Left(1));
int nInningsWei=atoi((strRandom.Right(6)).Left(1));
FLOAT fSYSocre=atof(strScore)/13.0f;
FLOAT fSYInnings=atof(strInnings)/7.0f;
if(((int)(fSYSocre*100)%100)!=0||((int)(fSYInnings*100)%100)!=0)
{
strInfo.Format("剩余分数:%d,剩余局数:%d",0,0);
SetDlgItemText(IDC_STATIC_SY,strInfo);
return FALSE;
}
int nSYSocre=atoi(strScore)/13-m_llNumber1;
int nSYInnings=atoi(strInnings)/7-m_llNumber2;
if(nSYSocre<0||nSYInnings<0)
{
strInfo.Format("剩余分数:%d,剩余局数:%d",0,0);
SetDlgItemText(IDC_STATIC_SY,strInfo);
return FALSE;
}
strInfo.Format("剩余分数:%d,剩余局数:%d",nSYSocre,nSYInnings);
SetDlgItemText(IDC_STATIC_SY,strInfo);
return TRUE;
}