zoukankan      html  css  js  c++  java
  • 跟我一起玩Win32开发(24):计时器

    有好些时间没写博客了,今天要来耍一下计时器,就是我们常说的Timer,它虽然不是什么复杂的东西,也称不 上牛X,不过,用处还是不少的,对于那些需要每隔一定时间执行一次的任务,那是相当有用。

    先来认识一下一对函数,注意,是一对,不是一个。

    SetTimer——设置并启用计时器;

    KillTimer——取消计时器。

    现在你明白为什么要一对的原因了,就好比进程操作,有启动或创建进程的函数,就肯定要有关闭进程的函数;有GetDC就肯定要伴随着ReleaseDC函数。阴与阳是此消彼长的。

    先说SetTimer,函数的定义我不说了,自己看头文件和MSDN就行了,主要说说以下两个参数:

    nIDEvent指的是计时器的ID,一个数值,你可以随例取,只要不是负数不是小数就行,例如10,200,56,115,222等;最后一个参数lpTimerFunc是指向一个回调函数的指针,这个与WindowProc类似的,但是这个参数是可以为NULL的。

    当该参数为NULL时,在WindowProc中你就要捕捉WM_TIMER消息,不过,这个是消息是低优先级的,系统会在处理完其他消息后,闲着没事干才会来处理WM_TIMER消息。如果lpTimerFunc参数不为NULL,就不用捕捉WM_TIMER了,直接在回调函数中处理即可。

    如果所使用的Timer的ID已经存在,那么就会以新的Timer来取代原有的Timer。

    KillTimer好说,就是销毁计时器,其中,Timer的ID要与前面SetTimer时用的ID保持一致,这个就不用特别说明了,你拿着你的借书证去图书馆借书,到还书的时候,你当然不会拿别人的借书证去还书吧?

     理论的东西都是说多无益,还是用实例来说话吧。

    先简单说说这个例子,主要运用计时器,每隔一秒(1000毫秒)执行一次,但每次的情况不同,所以用一个BOOL类型的变量来标识,如果为TRUE就在WM_PAINT事件中把窗口的客户区域填充为红色,如果为FALSE就不填充。如此,就可以使得窗口呈现出一闪一闪的效果。

    我只贴出核心代码,完整的例子我随后上传到【资源】中。

    [cpp] view plain copy
     
    1. // Timer的回调函数  
    2. VOID CALLBACK TimerProc(  
    3.   _In_  HWND hwnd,  
    4.   _In_  UINT uMsg,  
    5.   _In_  UINT_PTR idEvent,  
    6.   _In_  DWORD dwTime  
    7. )  
    8. {  
    9.     isBorderDrawed = !isBorderDrawed;  
    10.     RECT rect;  
    11.     GetClientRect(hwnd,&rect);  
    12.     InvalidateRect(hwnd, &rect, TRUE);  
    13. }  


     

    [cpp] view plain copy
     
    1.       /* 处理WM_PAINT消息 */  
    2. ase WM_PAINT:  
    3. hdc = BeginPaint(hWnd, &ps);  
    4. // TODO: 在此添加任意绘图代码...  
    5.    // 获取窗口边框矩形  
    6. RECT rect;  
    7. GetClientRect(hWnd, &rect);  
    8. if (isBorderDrawed)  
    9. {  
    10.     HBRUSH hb = CreateSolidBrush(RGB(255,0,0));  
    11.     FillRect(hdc,&rect, hb);  
    12.     SelectObject(hdc,hb);  
    13. }  
    14. EndPaint(hWnd, &ps);  
    15. break;  


     

    结果就如下面两图所示。

  • 相关阅读:
    021.day21 反射 Class类 反射常用操作
    020.day20 线程概述 多线程优缺点 线程的创建 线程常用方法 生命周期 多线程同步
    019.day19 缓冲流 对象流 标准输入输出流
    018.day18 map集合如何实现排序 File类 IO流 字节流 字符流 编码
    017.day17 Map接口 克隆 treeSet集合排重缺陷
    016.day16 HashSet TreeSet 比较器Comparable Comparator
    015.day15
    014.day14
    013.day13
    线程
  • 原文地址:https://www.cnblogs.com/weekbo/p/8681941.html
Copyright © 2011-2022 走看看