zoukankan      html  css  js  c++  java
  • MFC定时器

     

     

    在程序中我们经常要使用定时刷新的功能,典型的应用是在信息管理系统中表单要跟着数据库中的数据变动。MFC提供了定时器来完成这个功能。

    =========================================================================

    在MFC中和定时器相关的有三个函数:

    UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)( HWND, UINT, UINT, DWORD) );
    afx_msg void OnTimer( UINT nIDEvent );
    BOOL KillTimer( int nIDEvent );

    =========================================================================

    参数说明:
    UINT nIDEvent:定时器的ID,给定时器唯一的身份验证,如果在一个程序中有多个定时器可以用这个ID来确定是那个定时器发送的消息。
    UINT nElapse: 定义刷新时间,即间隔多长时间刷新一次,单位是毫秒。
    void (CALLBACK EXPORT* lpfnTimer)( HWND, UINT, UINT, DWORD):
                  这个回调函数中实现刷新时所做的操作,如在数据库中读取数据。但是我们大多数时候不在这里实现,而是在OnTimer中。

    =========================================================================


    函数功能:
    SetTimer用来定义一个定时器的属性,如改定时器的ID,刷新时间,处理函数。
    OnTimer实际时系统定义消息用来响应WM_TIMER消息,在这里可以实现对多定时器中的各个定时器分别响应,这里才时定时程序大展宏图的地方。
    KillTimer用来结束一个定时器。

    下面我们用一个例子来说明定时器的使用:
       这个例子用来实现一个简单的功能,就是在一个单文档程序中,每间隔5秒弹出一个消息框提示“定时器1”,每隔7秒弹出一个消息框提示“定时器2”。
       建立单文档程序略,一路Next。

    =========================================================================

    (1)在resource.h中定义两个定时器的ID

    #define IDTIMER1  1
    #define IDTIMER2  2


    (2)在CMainFrame的OnCreate函数中定义两个定时器的属性。

    SetTimer(TIMEID1,5000,0);
    SetTimer(TIMEID2,7000,0);

    (3) CMainFrame中对WM_TIMER进行响应。

    复制代码
    oid CMainFrame::OnTimer(UINT nIDEvent)
    {
        // TODO: Add your message handler code here and/or call default
        switch(nIDEvent) {
        case TIMEID1:
            {   
                AfxMessageBox("定时器1!");
                break;
            }
    case TIMEID2:
            {   
                AfxMessageBox("定时器2!");
                break;
            }
        default:
            ;
        }
       
        CFrameWnd::OnTimer(nIDEvent);
    }
    复制代码

    (4)在CMainFrame的析构函数中添加

    KillTimer(IDTIMER1);
    KillTimer(IDTIMER2);

    ==============================

    参考2

    当执行到程序的某一行代码时,需要添加计时器,就用这条语句:

    SetTimer(1, 1000, NULL);

    参数如下:

    UINT_PTR SetTimer(UINT_PTR nIDEvent, UINT nElapse,
      void (CALLBACK* lpfnTimer)(HWND, UINT, UINT_PTR, DWORD));

    设置好后计时器立马生效,1秒后计时器发生中断,在代码所在的类中进行捕捉:

    1.在该类的消息中添加:

    BEGIN_MESSAGE_MAP(CTab1, CDialog)  // CTab1是自己定义的一个类
        ...
        ON_WM_TIMER()
        ...
    END_MESSAGE_MAP()

    2.所在的类中添加成员函数:

    void OnTimer(UINT_PTR nIDEvent);

    3.添加函数的代码,即捕捉后的执行代码:

    复制代码
    void CTab1::OnTimer(UINT_PTR nIDEvent)
    {
        switch (nIDEvent)
        {
        case 1:  // 计时器1
                   .... // 处理的代码
                   KillTimer(1);  // 删除此计时器,否则计时器中断完后会自动重新开始计时,到下一次中断时还会发生新的中断
                   break;
    
        case 2:  // 计时器2
                   .... // 处理的代码
                   break;
        default:
                   MessageBox("default: KillTimer");
                   KillTimer(nIDEvent);
                   break;
        }
    }
    复制代码
  • 相关阅读:
    java的构造方法 java程序员
    No result defined for action cxd.action.QueryAction and result success java程序员
    大学毕业后拉开差距的真正原因 java程序员
    hibernate的回滚 java程序员
    验证码 getOutputStream() has already been called for this response异常的原因和解决方法 java程序员
    浅谈ssh(struts,spring,hibernate三大框架)整合的意义及其精髓 java程序员
    你平静的生活或许会在某个不可预见的时刻被彻底打碎 java程序员
    Spring配置文件中使用ref local与ref bean的区别. 在ApplicationResources.properties文件中,使用<ref bean>与<ref local>方法如下 java程序员
    poj1416Shredding Company
    poj1905Expanding Rods
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/4461708.html
Copyright © 2011-2022 走看看