有好些时间没写博客了,今天要来耍一下计时器,就是我们常说的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就不填充。如此,就可以使得窗口呈现出一闪一闪的效果。

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

  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. }
  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;

结果就如下面两图所示。

最新文章

  1. 开发者接入 基本配置 服务器配置 out.aspx
  2. SBCL 从REPL 中提取lisp代码
  3. Unity Shaders and Effets Cookbook
  4. Linux进程间通信:IPC对象——信号灯集详解
  5. 贴心小技能——纯CSS实现的帮助提示
  6. ccrendertexture
  7. windows可以登录qq,但无法打开浏览器页面
  8. mysql插入数据后返回自增ID的方法,last_insert_id(),selectkey
  9. 使用MBROSTool 工具制作U盘多启动盘的方法总结
  10. windows 系统验证是否为正版
  11. jQuery事件学习
  12. 从零开始搭建高性能高可用Tomcat服务器
  13. 【thinkphp5】安全建议:隐藏后台登录入口地址
  14. android 开发中 sdk 无法更新
  15. 查看Oracle数据库SQL执行历史
  16. e与复利
  17. Ubuntu几种常见乱码解决方法
  18. SqlServer插入1000条记录
  19. [转载]java中io流关闭的顺序
  20. 25个iptables常用示例

热门文章

  1. ScrollView白边问题
  2. 图像处理之 opencv 学习---矩阵的操作
  3. subclassdlgitem
  4. Eclipse中设置编码的方法
  5. jquery.validate ajax验证
  6. linux下如何用php读取word
  7. css简单的数学运算
  8. redis的图形界面管理工具
  9. leetcode 681. Next Closest Time
  10. 根据用户时区显示当地时间 javascript+php