用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<
详情请见源码:点击打开链接