MFC 基本对话框 ontimer的问题

tufei2963 2011-04-09 11:01:58
是这样的、老师写的个对话框版本的抽奖工程、让我们改进下。三个静态文本框、settimer()后在ontimer()的代码如下:
void CMy_Ex_LotteryDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
// CString str;
int i;
switch(nIDEvent)
{
case 1:
i=rand()%10+1;
if(i<23)
{
str1.Format("%d",i);
GetDlgItem(IDC_STATIC1)->SetWindowText(str1);
}
break;
case 2:
i=rand()%10+1;
if(i<23)
{
str2.Format("%d",i);
GetDlgItem(IDC_STATIC2)->SetWindowText(str2);
}
break;
case 3:
i=rand()%10+1;
if(i<23)
{
str3.Format("%d",i);
GetDlgItem(IDC_STATIC3)->SetWindowText(str3);
}
break;
}

CDialog::OnTimer(nIDEvent);
}

这样我们在killtimer的时候、就回显示我们的抽奖结果 三个随机数。
但问题是 :要不出现重复的数字。
我试过用链表。但失败了(所以关于链表的我删掉了。。。。)。我的想法是只把最终在界面显示的数字存入链表中、然后下个显示的数字和链表里面比较、相等的话再随机产生一个数、不相等就显示、但由于ontimer总是隔一段时间运行一次、我不知道代码到底该放入哪里。还是我的想法根本就是错的。求大侠们帮帮忙!小弟谢谢啦。
...全文
327 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
tufei2963 2011-04-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 huangcheng90 的回复:]
引用 3 楼 tufei2963 的回复:

还有个问题就是 当有多个nIDEvent的时候、onTimer()又是怎么执行的呢?

当然是到达指定的时间,就会响应WM_TIMER消息,你的代码里面是正确的,当然你得调用三次SetTimer,并且指定三个不同的ID
[/Quote]
是这样的、我写了两个按钮start、和stop.代码如下、
void CMy_Ex_LotteryDlg::OnButtonStart()
{
// TODO: Add your control notification handler code here
int i;
//从1开始的
for(i=1;i<4;i++)
{
SetTimer(i,100,NULL);
}
}
void CMy_Ex_LotteryDlg::OnButtonStop()
{
// TODO: Add your control notification handler code here
UpdateData(true);
CString str,text;
int i,k=0;
int num;
str="";
for(i=1;i<4;i++)
{
KillTimer(i);
m_Static[i-1]->GetWindowText(text);
num=atoi(text.GetBuffer(text.GetLength()));
if(i==1&&m_num_1==num)
k++;
if(i==2&&m_num_2==num)
k++;
if(i==3&&m_num_3==num)
k++;
text.ReleaseBuffer();
str=str+text+" ";
}
GetDlgItem(IDC_STATIC1)->SetWindowText(str1);
GetDlgItem(IDC_STATIC2)->SetWindowText(str2);
GetDlgItem(IDC_STATIC3)->SetWindowText(str3);
if(k==1)
MessageBox("恭喜您、三等奖!");
else if(k==2)
MessageBox("恭喜您、二等奖!");
else if(k==3)
MessageBox("恭喜您、一等奖啊!");

// draw(IDC_STATIC);
GetDlgItem(IDC_STATIC)->SetWindowText("本期中奖号码为:"+str);

// UpdateData(FALSE);

}

我想问的是、在按下start后、然后ontimer是怎么执行的啊、是这样吗
传递nIDevent=1给ontimer 执行case 1、然后传递nIDEvent=2给ontimer 执行case 2、是这样吗?
疯狂-的-蜗牛 2011-04-10
  • 打赏
  • 举报
回复
首先,你为什么要设置3个定时器(1\2\3)?其实只要一个就可以了,3个也行但是麻烦了;其次你是要不产生重复的数字,但是你的随机函数大都是产生一位数0——9之间,这样一来,排列组合的知识,也就只有10*10*10=1000种情况,100毫秒一次,1000次一下子就完了,不重复不大可能。给点建议:在rand()之间,添加种子: srand((unsigned) time(NULL));(#include "time.h")
tufei2963 2011-04-10
  • 打赏
  • 举报
回复
好吧、我自己解决了、还是谢谢大家。
HowToP2p 2011-04-10
  • 打赏
  • 举报
回复
产生不重复的一组三个数?
大致就是用个vector存放之前的3个数的数组指针,然后后来产生的数与容器里的比较,重复就重新产生三个
疯狂-的-蜗牛 2011-04-10
  • 打赏
  • 举报
回复
你在一个函数里面SetTimer(1,100,NULL);当执行这个函数的时候,每隔100毫秒就调用OnTimer中的case 1:……一次
Dreadnought 2011-04-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tufei2963 的回复:]

还有个问题就是 当有多个nIDEvent的时候、onTimer()又是怎么执行的呢?
[/Quote]
当然是到达指定的时间,就会响应WM_TIMER消息,你的代码里面是正确的,当然你得调用三次SetTimer,并且指定三个不同的ID
tufei2963 2011-04-10
  • 打赏
  • 举报
回复
还有个问题就是 当有多个nIDEvent的时候、onTimer()又是怎么执行的呢?
tufei2963 2011-04-10
  • 打赏
  • 举报
回复
我使用链表可以成功了、但是是在switch语句前面使用了一个MessageBox(),为什么使用了MessageBox就可以了啊、不使用的话还是会显示重复。哪位高手可以告诉我是什么原因、代码如下。

void CMy_Ex_LotteryDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
int i;

//这里是我添加的
MessageBox("");

node p;
p=lottery_list;
switch(nIDEvent)
{
case 1:
i=rand()%3+1;
//产生的数加入到链表中、就是修改链表中第一个节点的值、链表初始化值都是0
_replace(&(p->next),i);
str1.Format("%d",i);
GetDlgItem(IDC_STATIC1)->SetWindowText(str1);
break;
case 2:
//产生随机数、如果在链表里面有的话、继续产生随机数直到不和第一个数重复
while(i=rand()%3+1,search_num(lottery_list,i));
p=p->next->next;
_replace(&p,i);
str2.Format("%d",i);
GetDlgItem(IDC_STATIC2)->SetWindowText(str2);
break;
case 3:
//同上
while(i=rand()%3+1,search_num(lottery_list,i));
str3.Format("%d",i);
GetDlgItem(IDC_STATIC3)->SetWindowText(str3);
// draw(IDC_STATIC3);
break;
}

// lottery_list = create();
CDialog::OnTimer(nIDEvent);
}
heartgoon2010 2011-04-10
  • 打赏
  • 举报
回复
学习了
tufei2963 2011-04-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mfcing 的回复:]
首先,你为什么要设置3个定时器(1\2\3)?其实只要一个就可以了,3个也行但是麻烦了;其次你是要不产生重复的数字,但是你的随机函数大都是产生一位数0——9之间,这样一来,排列组合的知识,也就只有10*10*10=1000种情况,100毫秒一次,1000次一下子就完了,不重复不大可能。给点建议:在rand()之间,添加种子: srand((unsigned) time(NULL));(#inclu……
[/Quote]
呵呵、我是老是原码上进行的修改。所以三个定时器。 想问一下、这个定时器调用的时候是怎么样的个程序啊、首先SetTimer(nIDEvent,nElapse,NULL)是不是说nIDEvent这个定时器每隔nElapse毫秒的时候就调用onTimer函数一次?
tufei2963 2011-04-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 mfcing 的回复:]
引用 9 楼 tufei2963 的回复:
引用 8 楼 mfcing 的回复:
是的(回复内容太短,发不出去,晕死!)

哥们 我现在还是解决不了啊、产生的始终有重复的、能帮帮吗

你的i=rand()%10+1;这样I太小了,不重复才怪。你可以把I的取值范围扩大啊:i=rand()%100+1;让I在0——100内随机取,岂不是更好?当然了,还可以更大……
[/Quote]
我就是为了实现它、现在用的是rand()%3+1
疯狂-的-蜗牛 2011-04-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 tufei2963 的回复:]
引用 8 楼 mfcing 的回复:
是的(回复内容太短,发不出去,晕死!)

哥们 我现在还是解决不了啊、产生的始终有重复的、能帮帮吗
[/Quote]
你的i=rand()%10+1;这样I太小了,不重复才怪。你可以把I的取值范围扩大啊:i=rand()%100+1;让I在0——100内随机取,岂不是更好?当然了,还可以更大……

tufei2963 2011-04-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 mfcing 的回复:]
是的(回复内容太短,发不出去,晕死!)
[/Quote]
哥们 我现在还是解决不了啊、产生的始终有重复的、能帮帮吗
疯狂-的-蜗牛 2011-04-10
  • 打赏
  • 举报
回复
是的(回复内容太短,发不出去,晕死!)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧