问题描述
- C++代码转化为C#代码 求高手指点,写出注释谢谢啊
-
// 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;
}