源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

VC定时器的用法实例详解

  • 时间:2022-05-26 10:14 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:VC定时器的用法实例详解
本文实例讲述了VC中定时器的用法,分享给大家供大家参考。具体用法分析如下: 定时器在VC中的使用频繁,其原型为:
[u]复制代码[/u] 代码如下:
WINUSERAPI UINT WINAPI SetTimer ( HWND hWnd , UINT nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc);
其中的参数用法如下: hWnd       是欲设置定时器的窗体句柄。定时时间到时,系统会向该窗体发送WM_TIMER消息。 nIDEvent     定时器标识符。在一个窗体内可以使用多个定时器,不同的定时器根据nIDEvent来区分。 uElapse    定时时间,单位是毫秒。 lpTimerFunc   定时器的回调函数。如果该值为NULL,定时时间到时,定时器发送的消息WM_TIMER由窗体映像该消息的函数处理;否则由回调函数处理,说白一点,回调函数就是取代OnTimer的处理函数。 通常,我们在使用定时器时,只用到三个参数,即
[u]复制代码[/u] 代码如下:
UINT CWnd::SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)( HWND, UINT, UINT, DWORD) );
其实,这个函数只是MFC对API的封装,其实现函数为:
[u]复制代码[/u] 代码如下:
_AFXWIN_INLINE UINT CWnd::SetTimer(UINT nIDEvent, UINT nElapse,        void (CALLBACK* lpfnTimer)(HWND, UINT, UINT, DWORD))        {    ASSERT(::IsWindow(m_hWnd)); return ::SetTimer(m_hWnd, nIDEvent, nElapse,        (TIMERPROC)lpfnTimer); }
由此可见,CWnd::SetTimer只是将API函数SetTimer的第一个参数设置成它自己的句柄而已。 有了上面的认识,对定时器的使用就清楚了,下面举例说明定时器的具体使用。 1.打开VC,新建一基于对话框的工程,工程名为Test。在对话框上添加一按钮,将其ID改为IDC_BUTTON_START,Caption改为 Start. 映像该按钮的BN_CLICKED消息,void CTestDlg::OnButtonStart(); 2.再在对话框上添加一按钮,ID为ID_BUTTON_STOP,Caption改为Stop,映像消息为void CTestDlg::OnButtonStop(); 3.添加一个Lable,ID改为IDC_STATIC_TIME,用于记数,表明定时器函数的执行。 4.映像对话框的WM_TIMER消息,void CTestDlg::OnTimer(UINT nIDEvent); BEGIN_MESSAGE_MAP(CAssistantDlg, CDialog)     ON_WM_TIMER() END_MESSAGE_MAP() 以上的定现函数如下所示:
[u]复制代码[/u] 代码如下:
void CTestDlg::OnButtonStart() {        SetTimer(1,1000,NULL);//启动定时器1,定时时间是1秒 } void CTestDlg::OnButtonStop() {        KillTimer(1);        //关闭定时器1。 } void CTestDlg::OnTimer(UINT nIDEvent) {        static int nTimer=0;        CString strTmp="";        strTmp.Format("Timer: %d",nTimer++);        CWnd *pWnd=GetDlgItem(IDC_STATIC_TIME);        pWnd->SetWindowText(strTmp);   将Lable中设置新值,表明定时器已经工作。        CDialog::OnTimer(nIDEvent); }
回调函数的使用。 如果不想使用窗体的WM_TIMER消息函数处理,可以使用回调函数来取代,读者可以在上面例子的基础上,增加一个回调函数,以证实前面的讨论。 首先,定义一个回调函数,回调函数的定义必须按照如下格式。
[u]复制代码[/u] 代码如下:
void CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime );
我的实现函数如下:
[u]复制代码[/u] 代码如下:
void CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime ) { AfxMessageBox("Timer is running!");//定时器时间到,强出一对话框,表明定时器已经运行。 }
将上面的启动函数稍做修改
[u]复制代码[/u] 代码如下:
void CTestDlg::OnButtonStart() { // SetTimer(1,1000,NULL);//启动定时器1,定时时间是1秒    SetTimer(1,1000,(TIMERPROC)TimerProc);//用回调函数处理,此时对话框的消息处理函数不再处理。 }
希望本文所述对大家的VC程序设计有所帮助。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部