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<int> 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<<ch<<endl;
	
	strTime.Format(_T("抽奖时间:\n     %d-%d-%d  %02d:%02d:%02d"),
		sm.wYear,sm.wMonth,sm.wDay,sm.wHour,sm.wMinute,sm.wSecond);
	len= WideCharToMultiByte(CP_ACP,0,strTime,strTime.GetLength(),NULL,0,NULL,NULL);
	char *c=new char[len+1];
	WideCharToMultiByte(CP_ACP,0,strTime,strTime.GetLength(),c,len,NULL,NULL);
	c[len]='\0';
	os<<c<<endl;
	CString strReward;
	strReward.Format(_T("抽奖结果:\n     蓝号:%02d\n     红号依次为:%02d %02d %02d %02d %02d %02d"),
		redNum,blueNum[0],blueNum[1],blueNum[2],blueNum[3],blueNum[4],blueNum[5]);
	len= WideCharToMultiByte(CP_ACP,0,strReward,strReward.GetLength(),NULL,0,NULL,NULL);
	char *p=new char[len+1];
	WideCharToMultiByte(CP_ACP,0,strReward,strReward.GetLength(),p,len,NULL,NULL);
	p[len]='\0';
	os<<p<<endl;
	os<<"=============================================================="<<endl;
	os.close();
}

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

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<<c;
	os.close();
}

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值