BOOL CAlarmClockDlg::OnInitDialog()
{
……
SetTimer(1,1000,NULL);
……
}
void CAlarmClockDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
static int respons=1;
//do something
if(…… && respons)
{
MessageBox("时间到!");
respon=0;
}
CDialog::OnTimer(nIDEvent);
}
为啥我在这里加的respons没有起作用。到时间时,MessageBox竟一直不断弹出。请问我是哪里出毛病了??
9 个解决方案
#1
调整一下:
if(…… && respons)
{
respon=0;
MessageBox("时间到!");
}
if(…… && respons)
{
respon=0;
MessageBox("时间到!");
}
#2
#3
请问flydreamGG ,为什么将response=o放在MessageBox()后面就不能控制消息框只弹出一次??我是新手,不太理解
#4
因为messagebox可能导致OnTimer()函数退出,没有给respon赋值为0
#5
static int respons=1;
这个局部静态变量一开始是1,但是后来被你修改为0了,并且以后一直都是保持0值
你对程序的存储结构不是很理解,所以导致你以为再次进入OnTimer后response会重新赋值为1
但由于静态变量保存在堆内存中,而你的函数代码保存在栈中
函数部分每次执行的时候都是会被重新赋值的,但堆内存中的数据不会被清掉
#6
呵呵,5楼你误解的我的意思,我是想让这个MessageBox仅仅弹出一次,所以我就在if中判断当response为1时才弹出,然后修改response,以后就不让它弹出了。好像是弹出MessageBox()后,后面的代码没有执行,为啥????????
#7
先理解消息循环的机制,你弹出MessageBox之后,MessageBox接管了消息的处理,屏蔽了对父窗口的一些消息,但是WM_TIMER消息是不屏蔽的,所以在MessageBox里面又进入到OnTimer这个函数中来,继续弹出MessageBox,如果你按1楼的把 respon = 0 放在MessageBox之前,就没问题了.
#8
如果只是弹出一次:
KillTimer(nIDEvent);
MessageBox("时间到!");
CDialog::OnTimer(nIDEvent);
KillTimer(nIDEvent);
MessageBox("时间到!");
CDialog::OnTimer(nIDEvent);
#9
以前帖子里已经讨论过了,http://bbs.csdn.net/topics/50386820
"MessageBox后并不会阻塞主消息循环" - 这句是关键。
"MessageBox后并不会阻塞主消息循环" - 这句是关键。
#1
调整一下:
if(…… && respons)
{
respon=0;
MessageBox("时间到!");
}
if(…… && respons)
{
respon=0;
MessageBox("时间到!");
}
#2
#3
请问flydreamGG ,为什么将response=o放在MessageBox()后面就不能控制消息框只弹出一次??我是新手,不太理解
#4
因为messagebox可能导致OnTimer()函数退出,没有给respon赋值为0
#5
static int respons=1;
这个局部静态变量一开始是1,但是后来被你修改为0了,并且以后一直都是保持0值
你对程序的存储结构不是很理解,所以导致你以为再次进入OnTimer后response会重新赋值为1
但由于静态变量保存在堆内存中,而你的函数代码保存在栈中
函数部分每次执行的时候都是会被重新赋值的,但堆内存中的数据不会被清掉
#6
呵呵,5楼你误解的我的意思,我是想让这个MessageBox仅仅弹出一次,所以我就在if中判断当response为1时才弹出,然后修改response,以后就不让它弹出了。好像是弹出MessageBox()后,后面的代码没有执行,为啥????????
#7
先理解消息循环的机制,你弹出MessageBox之后,MessageBox接管了消息的处理,屏蔽了对父窗口的一些消息,但是WM_TIMER消息是不屏蔽的,所以在MessageBox里面又进入到OnTimer这个函数中来,继续弹出MessageBox,如果你按1楼的把 respon = 0 放在MessageBox之前,就没问题了.
#8
如果只是弹出一次:
KillTimer(nIDEvent);
MessageBox("时间到!");
CDialog::OnTimer(nIDEvent);
KillTimer(nIDEvent);
MessageBox("时间到!");
CDialog::OnTimer(nIDEvent);
#9
以前帖子里已经讨论过了,http://bbs.csdn.net/topics/50386820
"MessageBox后并不会阻塞主消息循环" - 这句是关键。
"MessageBox后并不会阻塞主消息循环" - 这句是关键。