MFC模拟双色球抽奖

用MFC+ATL写了一个很简单的模拟双色球抽奖小程序

主要是用到了ATL中的deque容器:

初始化对话框,以及文件:

BOOL CRewardDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	using namespace std;
	// 将“关于...”菜单项添加到系统菜单中。

	// 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);		// 设置小图标
	redNum=0;
	for(int i=0;i<6;i++)
		blueNum[i]=0;
	srand((UINT)time(NULL));//播种
	CString str=GetAppPath()+_T("\\Count.dat");
	if(!IsFileExist(str))
	{
		m_nCount=0;
		ofstream i(str);
		i.close();
	}
	else
	{
		string s="";
		ifstream is(str);
		while(true)
		{
			if(is.get()==':')
				break;
		}
		while(!is.eof())
		{
			char ch=is.get();
			s+=ch;
		}
		const char* c=s.c_str();
		m_nCount=atoi(c);
		is.close();
	}
	// TODO: 在此添加额外的初始化代码
	CString str1(_T("点击按钮开始抽奖"));
	m_btn1.Init(str1);
	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

以下函数用来绘制圆形:

void CRewardDlg::DrawCicle(CDC* pDC,CRect& rc/*确定圆的矩形区域*/,int number/*圆上面显示的数字 */, COLORREF rgb/*圆的颜色*/)
{
	//pDC->FillSolidRect(rc,rgb);
	CString str;
	if(m_IsInit)
		str.Format(_T("%02d"),number);
	else
		str=_T("**");
	CFont ft,*pOldFt=NULL;
	ft.CreatePointFont(240,_T("黑体"));
	
	pOldFt=pDC->SelectObject(&ft);
	CBrush br,*pOldBr=NULL;
	br.CreateSolidBrush(rgb);
	pOldBr=pDC->SelectObject(&br);
	pDC->Ellipse(&rc);
	pDC->SetBkMode(TRANSPARENT);
	pDC->SetTextColor(RGB(0,255,0));
	pDC->DrawText(str,rc,DT_VCENTER|DT_CENTER|DT_SINGLELINE);
	//释放资源
	pDC->SelectObject(pOldFt);
	pDC->SelectObject(pOldBr);
	br.DeleteObject();
	pOldBr->DeleteObject();
	pOldBr=NULL;
}

点击开始抽奖按钮:

void CRewardDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	m_IsInit=TRUE;
	CString str;
	if(m_IsStart)//已经开始,进入后结束抽奖
	{
		m_IsStart=FALSE;
		m_btn1.SetWindowTextW(_T("开始抽奖"));
		str=_T("点击按钮开始抽奖");
		m_btn1.Init(str);
		EndReward();
		this->SaveRewordData();
	}
	else//已经结束,进入后开始抽奖
	{
		int num=rand()%4+4;
		SetTimer(2,num*1000,NULL);
		m_IsStart=TRUE;
		m_btn1.SetWindowTextW(_T("完成抽奖"));
		str=_T("点击按钮结束抽奖");
		m_btn1.Init(str);
		StartReward();
	}
}

设置定时器,定时器中实现模拟抽奖:

void CRewardDlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	using namespace std;
	if(1==nIDEvent)
	{
		deque que;
		for(int i=0;i<33;i++)
			que.push_front(i+1);
		for(int i=0;i<6;i++)
		{
			int count=que.size();
			int index=rand()%count;
			blueNum[i]=que.at(index);
			que.erase(que.begin()+index);
			
		}
		redNum=rand()%16+1;	
		Invalidate();
	}
	if(2==nIDEvent)
	{
		KillTimer(1);
	}
	CDialog::OnTimer(nIDEvent);
}

将历史抽奖记录保存到文件中:

void CRewardDlg::SaveRewordData(void)
{
	using namespace std;
	CString strAppPath=GetAppPath();
	ofstream os(strAppPath+_T("\\Reward.log"),ios_base::out|ios_base::app);
	int totalLine=0;
	ifstream is(strAppPath+_T("\\Reward.log"));
	while(!is.eof())
	{
		char c=is.get();
		if(c=='\n')
			totalLine++;
	}

	SYSTEMTIME	sm;
	::GetLocalTime(&sm);
	CString strTime;
	CString strNum;
	strNum.Format(_T("第%d次抽奖结果如下"),m_nCount);
	int len= WideCharToMultiByte(CP_ACP,0,strNum,strNum.GetLength(),NULL,0,NULL,NULL);
	char *ch=new char[len+1];
	WideCharToMultiByte(CP_ACP,0,strNum,strNum.GetLength(),ch,len,NULL,NULL);
	ch[len]='\0';
	os<

记录抽奖次数,保存到文件中:

void CRewardDlg::WriteRewardCount(void)
{
	using namespace std;
	CString str=GetAppPath()+_T("\\Count.dat");
	ofstream os(str);
	str.Empty();
	str.Format(_T("已经抽奖次数:%d"),m_nCount);
	int len= WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),NULL,0,NULL,NULL);
	char *c=new char[len+1];
	WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),c,len,NULL,NULL);
	c[len]='\0';
	os<

详情请见源码:点击打开链接

你可能感兴趣的:(MFC模拟双色球抽奖)