• 跟我一起玩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;  


     

    结果就如下面两图所示。

  • 相关阅读:
    js中属性点.和中括号[]的关系。
    jQuery中的$(window).load()与$(document).ready()以及jquery $(document).ready() 与window.onload的区别
    今天中了一个脚本病毒。把我的所有 html 加了 vbs 脚本,WriteData 是什么鬼?
    原生js 当前时间 倒计时代码
    一看就懂得移动端rem布局、rem如何换算
    使用CSS实现三栏自适应布局(两边宽度固定,中间自适应)
    js运算符的一些特殊应用
    中文目录对 sublime text 有什么影响?
    Spring的注解@Qualifier小结
    伪共享(False Sharing)
  • 原文地址:https://www.cnblogs.com/weekbo/p/8681941.html
Copyright © 2020-2023  润新知