关于多定时器的调用 本帖最后由 xianglitian 于 2010-09-05 19:47:31 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不改这样写在按钮点击消息里用SetTimer(IDNum/*这是你设置的定时器的ID*/,1000/*这是定时器的频率*/,NULL);然后在OnTimer里通过判断nIDEvent==IDNum来判断是哪个定时器的工作 在按钮点击消息里用SetTimer(IDNum,1000,NULL);这样吗?然后在OnTimer里通过判断if(nIDEvent==1){ ...//}不太理解您的意思? 我刚才重新改过代码,直接在按钮的响应函数中添加代码void CPUMPView::OnBtnP1(){ MessageBox("开启泥泵" ); m_isclick = TRUE; SetTimer(1,1000,NULL); IDNum = 1;}void CPUMPView::OnBtnP2(){ MessageBox("关闭泥泵" ); m_isclick = FALSE; IDNum = 1;}void CPUMPView::OnBtnP3(){ MessageBox("增加泥泵转速" ); SetTimer(2,500,NULL); }这样的效果我可以实现我的一部分要求,譬如说点击第三个按钮直接调用第二个定时器,但是我想再点击按钮3继续调用第三个定时器就不知道怎么解决了?请问怎么弄? 你添加了时间消息响应了吗 wm_timer 你要用SetTimer函数设置定时器,每个定时器的ID不应该一样,然后在OnTimer函数里通过判断nIDEvent==定时器ID 来改变定时器的运行函数 比如说你可以在你的按钮点击函数中这样设置:首先初始化IDNum=1;void CPUMPView::OnBtnP1(){ MessageBox("开启泥泵" ); SetTimer(IDNum,1000/*这是定时器的频率*/,NULL); }void CPUMPView::OnBtnP2(){ MessageBox("关闭泥泵" ); SetTimer(IDNum++,1000/*这是定时器的频率*/,NULL); }void CPUMPView::OnBtnP3(){ MessageBox("增加泥泵转速" ); SetTimer(IDNum++,1000/*这是定时器的频率*/,NULL); }再在OnTimer中: if(nIDEvent== 1) //判断是第一个定时器 { =1; n++; CRect rect(0,0,250,768); InvalidateRect(&rect); } if(nIDEvent == 2) //第2个 {// KillTimer(1); nIDEvent=2; n++; CRect rect(0,0,250,768); InvalidateRect(&rect); } if(nIDEvent == 3) //第3个 { // KillTimer(1);// KillTimer(2); nIDEvent=3; n++; CRect rect(0,0,250,768); InvalidateRect(&rect); } 你的意思我理解,但是我怎么在Button的单击函数中调用不同的定时器呢?我原先代码如下。int CPUMPView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH)); //添加定时器设置 SetTimer(1,1000,NULL); SetTimer(2,500,NULL); SetTimer(3,100,NULL); return 0;}而ontimer函数代码如下: if(nIDEvent==1) { n++; CRect rect(0,0,250,768); InvalidateRect(&rect); } if(nIDEvent==2) { n++; CRect rect(0,0,250,768); InvalidateRect(&rect); } if(nIDEvent == 3) { n++; CRect rect(0,0,250,768); InvalidateRect(&rect); } n++; CRect rect(0,0,250,768); InvalidateRect(&rect); //使限定区域重绘但是在Button的响应函数如何调用呢? 看了一下你上面的程序按照我的理解,你是想让点击一个按钮,就只让这个按钮所代表的定时器工作,而其他两个按钮所代表的定时器不工作,如果是这个意思的话,你就不能在OnCreate中直接设置3个定时器,因为定时器是从它被设置的那一时刻就开始工作的如果我的理解正确的话,你应该在按钮点击函数中先删除另外两个定时器然后再设置这个按钮所代表的定时器,比如,你可以在OnBtnP1()中这样设置:KillTimer(2);KillTimer(3);SetTimer(1,1000,NULL); 不,我的意思是1号按钮是使用一号定时器,2号是不使用定时器,3号是点击一下用2号定时器,再点击是使用3号定时器,再点击不使用定时器。我回去试试看你说的在Button的响应函数里添加设置。 那也简单,在OnBtnP1()中KillTimer(2);KillTimer(3);SetTimer(1,1000,NULL);OnBtnP2()中;KillTimer(1);KillTimer(2);KillTimer(3);OnBtnP3()中;先设置成员变量int m_timer;初始化为1KillTimer(1);KillTimer(2);KillTimer(3);if(m_timer==1){m_timer=2;}else if(m_timer==2){m_timer=3;}else{m_timer=1;}switch(m_timer){case 1:break;case 2:SetTimer(m_timer,500,NULL);break;case 3:SetTimer(m_timer,100,NULL);break;} 不太可能实现按个按钮调用一个定时起你也一直没说你设置了三个定时器我是说你可以设置一个定时器然后再OnTimer里分拍用你现在的方法就可以了通过不同的ID(当然是自己控制的)来区分 if(nIDEvent== 1) { n++; CRect rect(0,0,250,768); InvalidateRect(&rect); } if(nIDEvent == 2) {// KillTimer(1); n++; CRect rect(0,0,250,768); InvalidateRect(&rect); } if( nIDEvent== 3) { // KillTimer(1);// KillTimer(2); n++; CRect rect(0,0,250,768); InvalidateRect(&rect); }是通过OnTimer()里面的一个参数nIDEvent来判断的 你在WM_CREATE消息的响应函数中调用SetTimer三个定时器,这个时候你的OnTimer已经在运行了 对啊。忘记了。那如果我在Button的响应函数里面设置的话,是点击响应才开始的吗? 我想问下就是如果说在WM_CREATE消息的响应函数中,设置了3个定时器,在Button的单击函数中用KillTimer函数的话,可以吗? 晕倒了ontimer里只要写不同事件的区分就行在button里写settimer在button里不需要写到ontimer和其他的 KillTimer可以在任何地方使用 包括OnTimer里 我按照你的方法改了下代码。如下//添加的按钮单击响应函数void CPUMPView::OnBtnP1(){ MessageBox("开启泥泵" ); m_isclick = TRUE; IDNum = 1; //添加定时器1号 SetTimer(IDNum,1000,NULL);}void CPUMPView::OnBtnP2(){ MessageBox("关闭泥泵" ); m_isclick = FALSE; IDNum = 1;}void CPUMPView::OnBtnP3(){ MessageBox("增加泥泵转速" ); if(m_isclick = TRUE&&IDNum<=3) { IDNum++; } else { m_isclick = FALSE; IDNum=1; } switch(IDNum) { case 1: SetTimer(IDNum,1000,NULL); break; case 2: SetTimer(IDNum,500,NULL); break; case 3: SetTimer(IDNum,100,NULL); break; } }发现了一个问题,为什么我单击按钮1,按钮3,循环后再单击按钮1,调用了定时器3呢? OK了。void CPUMPView::OnBtnP1(){MessageBox("开启泥泵" );m_isclick = TRUE;IDNum = 1;//添加定时器1号SetTimer(IDNum,1000,NULL);//KillTimer(2);//KillTimer(3);}忘记了。呵呵 基础知识,盼高手解答! 对话框问题 老问题希望大家解决,最好有代码.多线程 如何控制父窗口的控件 vc opengl 圆柱纹理问题 如何编程把一个bmp文件变成exe文件呢? CSDN今天怎么这么慢? 想得我头都晕了,这样写类对不对? OnConnect碰到FD_Read,程序是自动执行OnSend(表示可以发数据),还是根据FD_Read调用OnReceive()函数内容。 做折线图 怎么得到鼠标在列表控件上的位置 关于操作系统登录事件
SetTimer(IDNum/*这是你设置的定时器的ID*/,1000/*这是定时器的频率*/,NULL);然后在OnTimer里通过判断nIDEvent==IDNum来判断是哪个定时器的工作
在按钮点击消息里用
SetTimer(IDNum,1000,NULL);
这样吗?
然后在OnTimer里通过判断
if(nIDEvent==1)
{
...//
}
不太理解您的意思?
我刚才重新改过代码,直接在按钮的响应函数中添加代码void CPUMPView::OnBtnP1()
{
MessageBox("开启泥泵" );
m_isclick = TRUE;
SetTimer(1,1000,NULL);
IDNum = 1;
}
void CPUMPView::OnBtnP2()
{
MessageBox("关闭泥泵" );
m_isclick = FALSE;
IDNum = 1;
}
void CPUMPView::OnBtnP3()
{
MessageBox("增加泥泵转速" );
SetTimer(2,500,NULL);
}
这样的效果我可以实现我的一部分要求,譬如说点击第三个按钮直接调用第二个定时器,但是我想再点击按钮3继续调用第三个定时器就不知道怎么解决了?请问怎么弄?
首先初始化IDNum=1;
void CPUMPView::OnBtnP1()
{
MessageBox("开启泥泵" );
SetTimer(IDNum,1000/*这是定时器的频率*/,NULL);
}
void CPUMPView::OnBtnP2()
{
MessageBox("关闭泥泵" );
SetTimer(IDNum++,1000/*这是定时器的频率*/,NULL);
}
void CPUMPView::OnBtnP3()
{
MessageBox("增加泥泵转速" );
SetTimer(IDNum++,1000/*这是定时器的频率*/,NULL);
}再在OnTimer中:
if(nIDEvent== 1) //判断是第一个定时器
{
=1;
n++;
CRect rect(0,0,250,768);
InvalidateRect(&rect);
}
if(nIDEvent == 2) //第2个
{
// KillTimer(1);
nIDEvent=2;
n++;
CRect rect(0,0,250,768);
InvalidateRect(&rect);
}
if(nIDEvent == 3) //第3个
{
// KillTimer(1);
// KillTimer(2);
nIDEvent=3;
n++;
CRect rect(0,0,250,768);
InvalidateRect(&rect);
}
你的意思我理解,但是我怎么在Button的单击函数中调用不同的定时器呢?我原先代码如下。
int CPUMPView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH));
//添加定时器设置
SetTimer(1,1000,NULL);
SetTimer(2,500,NULL);
SetTimer(3,100,NULL);
return 0;
}而ontimer函数代码如下:
if(nIDEvent==1)
{
n++;
CRect rect(0,0,250,768);
InvalidateRect(&rect);
}
if(nIDEvent==2)
{
n++;
CRect rect(0,0,250,768);
InvalidateRect(&rect);
}
if(nIDEvent == 3)
{
n++;
CRect rect(0,0,250,768);
InvalidateRect(&rect);
}
n++;
CRect rect(0,0,250,768);
InvalidateRect(&rect);
//使限定区域重绘
但是在Button的响应函数如何调用呢?
比如,你可以在OnBtnP1()中这样设置:
KillTimer(2);
KillTimer(3);
SetTimer(1,1000,NULL);
不,我的意思是1号按钮是使用一号定时器,2号是不使用定时器,3号是点击一下用2号定时器,再点击是使用3号定时器,再点击不使用定时器。
我回去试试看你说的在Button的响应函数里添加设置。
KillTimer(2);
KillTimer(3);
SetTimer(1,1000,NULL);OnBtnP2()中;
KillTimer(1);
KillTimer(2);
KillTimer(3);OnBtnP3()中;
先设置成员变量int m_timer;初始化为1
KillTimer(1);
KillTimer(2);
KillTimer(3);
if(m_timer==1)
{
m_timer=2;
}
else if(m_timer==2)
{
m_timer=3;
}
else
{
m_timer=1;
}
switch(m_timer)
{
case 1:
break;
case 2:
SetTimer(m_timer,500,NULL);
break;
case 3:
SetTimer(m_timer,100,NULL);
break;
}
你也一直没说你设置了三个定时器
我是说你可以设置一个定时器
然后再OnTimer里分拍
用你现在的方法就可以了
通过不同的ID(当然是自己控制的)来区分
if(nIDEvent== 1)
{
n++;
CRect rect(0,0,250,768);
InvalidateRect(&rect);
}
if(nIDEvent == 2)
{
// KillTimer(1);
n++;
CRect rect(0,0,250,768);
InvalidateRect(&rect);
}
if( nIDEvent== 3)
{
// KillTimer(1);
// KillTimer(2);
n++;
CRect rect(0,0,250,768);
InvalidateRect(&rect);
}是通过OnTimer()里面的一个参数nIDEvent来判断的
对啊。忘记了。那如果我在Button的响应函数里面设置的话,是点击响应才开始的吗?
KillTimer函数的话,可以吗?
//添加的按钮单击响应函数
void CPUMPView::OnBtnP1()
{
MessageBox("开启泥泵" );
m_isclick = TRUE;
IDNum = 1;
//添加定时器1号
SetTimer(IDNum,1000,NULL);
}void CPUMPView::OnBtnP2()
{
MessageBox("关闭泥泵" );
m_isclick = FALSE;
IDNum = 1;
}void CPUMPView::OnBtnP3()
{
MessageBox("增加泥泵转速" );
if(m_isclick = TRUE&&IDNum<=3)
{
IDNum++;
}
else
{
m_isclick = FALSE;
IDNum=1;
}
switch(IDNum)
{
case 1:
SetTimer(IDNum,1000,NULL);
break;
case 2:
SetTimer(IDNum,500,NULL);
break;
case 3:
SetTimer(IDNum,100,NULL);
break;
}
}发现了一个问题,为什么我单击按钮1,按钮3,循环后再单击按钮1,调用了定时器3呢?
void CPUMPView::OnBtnP1()
{
MessageBox("开启泥泵" );
m_isclick = TRUE;
IDNum = 1;
//添加定时器1号
SetTimer(IDNum,1000,NULL);
//KillTimer(2);
//KillTimer(3);
}忘记了。呵呵