【MFC】定时器的使用
mfc吧
全部回复
仅看楼主
level 14
zhuangx 楼主
[揉脸]巧妙地使用定时器能达到意想不到的效果,写界面的时候能实现渐变,也能帮助多线程控制等
    我们知道,在VC的MFC中,已经为我们封装好了很多全面和强大的函数集,所以在MFC编程时,巧妙地调用MFC函数库可以为我们省去很多麻烦。其中定时器也可以在MFC程序中很好地利用。
     在MFC中和定时器相关的有三个函数:
1.设置定时器(定义一个定时器的属性):
   SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT*lpfnTimer)(HWND,UINT,UINT,DWORD));
2.定时器响应(响应系统定义WM_TIMER消息):
   OnTimer( UINT nIDEvent );
3.释放定时器:
   KillTimer( int nIDEvent );
     其中:
UINT nIDEvent:定时器的ID,在一个程序中用这个ID来确定是那个定时器发送的消息。
UINT nElapse: 定义刷新时间,即间隔多长时间刷新一次,单位是毫秒。
void (CALLBACK EXPORT* lpfnTimer)( HWND, UINT, UINT, DWORD):回调函数的参数,实现刷新时所做的操作,一般情况下都设为0。
     在这里就用一个简单的例子来说明定时器在MFC中是如何使用的。
1.建立单文档程序Timer。
2.在resource.h中定义两个定时器的ID
#define TIMER1   1
#define TIMER2   2
3.在CMainFrame的OnCreate函数中定义两个定时器的属性。
SetTimer(TIMER1,3000,0);
SetTimer(TIMER2,5000,0);
4.在类视图中右击CMainFrame属性,在消息响应函数中找到WM_TIMER,然后添加响应函数OnTimer()。
void CMainFrame::OnTimer(UINT nIDEvent)
{
     // TODO: Add your message handler code here and/or call default
     switch(nIDEvent)
     {
       case TIMER1:
       {    
           AfxMessageBox("定时器1!");
           break;
       }
       case TIMER2:
       {    
           AfxMessageBox("定时器2!");
            break;
       }
       default:
            break;
     }
     CFrameWnd::OnTimer(nIDEvent);
}
5.在CMainFrame的析构函数中添加释放定时器函数。
KillTimer(TIMER1);
KillTimer(TIMER2);
     这样,一个简单的定时器程序就生成了,运行后可以看到,每隔3秒就会弹出一个消息对话框“定时器1”,每隔5秒就会弹出一个消息对话框“定时器2”。
     这种情况是在程序运行后定时器就直接启动了,很多时候我们需要的是在响应一次事件或者说点击一个按钮后再去执行定时器,那么这时应该怎么修改呢?也用一个实例来说明吧,因为我觉得可能说一大堆废话也抵不上一个简单而
正确的
实例更具说服力。

2011年01月04日 15点01分 1
level 14
zhuangx 楼主
     现在,我生成了一个MFC多文档应用程序,我希望在点击菜单条上的某个按钮后再去执行定时器。这时就不是在CMainFrame里面操作了,因为我们是要在对话框上进行定时器的操作,而CView这个类是负责对话框的对应操作,所以要把定时器定义在CView里面。
1.建立多文档程序Timer。
2.在resource.h中定义两个定时器的ID
#define TIMER1   1
#define TIMER2   2
3.在CTimerView的OnInitialUpdate函数中定义两个定时器的属性。
SetTimer(TIMER1,3000,0);
SetTimer(TIMER2,5000,0);
4.在类视图中右击CTimerView属性,在消息响应函数中找到WM_TIMER,然后添加响应函数OnTimer()。
void CTimerView::OnTimer(UINT nIDEvent)
{
     // TODO: Add your message handler code here and/or call default
     //Hwnd为一个变量,初始值为false,点击某个按钮后在其响应函数中将其置为true
     switch(nIDEvent && Hwnd){
       case TIMER1:
       {    
           AfxMessageBox("定时器1!");
           break;
       }
       case TIMER2:
       {    
           AfxMessageBox("定时器2!");
            break;
       }
       default:
            break;
     }
     CFrameWnd::OnTimer(nIDEvent);
}
5.在CTimerView中添加OnDestroy()函数,在函数中释放定时器。
KillTimer(TIMER1);
KillTimer(TIMER2);
     现在,运行程序后,没有马上弹出预定的对话框,而是在我们点击某个按钮或者响应某个事件后对话框才弹出,同样是点击按钮后,每隔3秒弹出对话框“定时器1”,每隔5秒弹出“定时器2”。
     其实在不同的类,定时器的用法都是基本一致的,只要找到类的初始函数和释放函数,就能轻松实现定时功能了,就这么简单。
2011年01月04日 15点01分 2
level 1
[狂汗]学习了
2011年01月04日 21点01分 3
level 14
zhuangx 楼主
回复:3楼
[拍砖]
2011年01月05日 00点01分 4
level 1
楼主好好厉害哦
2011年01月23日 05点01分 5
level 1
把定时器属性SetTimer直接加在按钮响应函数里,在OnTimer函数里Switch(nIDEvent) { case:……} ,zhuangx大专家,这样能实现按钮启动定时器吗?
2011年01月24日 07点01分 6
level 14
zhuangx 楼主
回复:6楼
可以
2011年01月24日 09点01分 7
level 14
zhuangx 楼主
UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD) );  
参数含义:  
nIDEvent:是指设置这个定时器的iD,即身份标志,这样在OnTimer()事件中,才能根据不同的定时器,来做不同的事件响应。这个ID是一个无符号的整型。  
nElapse  
是指时间延迟。单位是毫秒。这意味着,每隔nElapse毫秒系统调用一次Ontimer()。  
void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD)  
指定应用程序提供的TimerProc回调函数的地址,来处里这个Timer事件。如果是NULL,处理这个Timer事件的定义是这个Timer的CWnd对象。他将WM_TIMER消息传递给这个对象,通过实现这个对象的OnTimer()事件来处理这个Timer事件。  

2011年02月10日 03点02分 9
level 14
zhuangx 楼主
.cpp文件
BOOL CTimerTestDlg::OnInitDialog()里调用SetTimer(10,2000,TimerProc);
2011年02月10日 03点02分 11
level 14
zhuangx 楼主
void CALLBACK EXPORT CTimerTestDlg::TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)   
{   
        CTime tmCur = CTime::GetCurrentTime();   
        TRACE(_T("我是定时器%d,现在是 [%.2d:%.2d:%.2d]\r\n"),nTimerid,tmCur.GetHour(),tmCur.GetMinute(),tmCur.GetSecond());   
        if(g_unCnt<3)   
        {   
               g_unCnt ++;   
               Sleep(5000);   
        }   
}  

2011年02月10日 03点02分 12
level 14
zhuangx 楼主
[汗]有什么优势说不上吧 看需求
2011年02月11日 02点02分 14
level 2
回调函数是提供给操作系统调用的。
回调函数就好像是一个中断处理函数,系统在符合你设定的条件时自动调用,
操作系统总能在恰当的时机去调用函数,无需我们关心。
2011年03月12日 00点03分 15
level 1
顶楼主
2011年03月25日 01点03分 16
level 1
不知道楼主是不是测试过写的程序,这样的话会不会出现弹出的消息框不停地出现关不掉呢
2011年06月12日 08点06分 17
level 1
大神 定时器启动后 怎么让程序停下来 比如说用一个停止按钮 怎么设置啊
2011年10月12日 13点10分 18
level 14
zhuangx 楼主
停止定时器? 响应按钮点击时间 里面加上killtime(nID)
2011年10月13日 00点10分 19
level 1
谢谢
2011年10月13日 06点10分 20
level 3
谢谢 学习了
2011年12月05日 09点12分 21
level 1
可以
2011年12月09日 08点12分 22
level 3
学习了
2011年12月18日 15点12分 23
1 2 尾页