MFC中SetTimer用法

MFC中SetTimer用法在编程时 会经常使用到定时器 使用定时器的方法比较简单 通常告诉 Windows 一个时间间隔 然后 WINDOWS 以此时间间隔周期性触发程序 通常有两种方法来实现 发送 WM TIMER 消息和调用应用程序定义的回调函数 1 1 nbsp 用 WM TIMER 来设置定时器先请看 SetTimer 这个 API 函数的原型 UINT PTRSetTimer HWNDhWnd nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp

在编程时,会经常使用到定时器。使用定时器的方法比较简单,通常告诉Windows一个时间间隔,然后WINDOWS以此时间间隔周期性触发程序。通常有两种方法来实现:发送WM_TIMER消息和调用应用程序定义的回调函数。

1.1 用WM_TIMER来设置定时器

先请看SetTimer这个API函数的原型

UINT_PTR SetTimer(
HWND hWnd,              // 窗口句柄

UINT_PTR nIDEvent,      // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
UINT uElapse,           // 时间间隔,单位为毫秒
TIMERPROC lpTimerFunc   // 回调函数
);



例如 
SetTimer(m_hWnd,1,1000,NULL); //一个1秒触发一次的定时器

在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了,例如:

UINT SetTimer(1,100,NULL);
函数反回值就是第一个参数值1,表示此定时器的ID号。

第二个参数表示要等待100毫秒时间再重新处理一次。第三个参数在这种方法中一般用NULL。
注意:设置第二个参数时要注意,如果设置的等待时间比处理时间短,程序就会出问题了。

1.2 调用回调函数

此方法首先写一个如下格式的回调函数

void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime);
然后再用SetTimer(1,100,TimerProc)函数来建一个定时器,第三个参数就是回调函数地址。

二、多个定时器的实现与应用

我们在安装定时器时都为其指定了ID,使用多个定时器时,该ID就发挥作用了。
不使用MFC时,当接收到WM_TIMER消息,WPARAM wParam中的值便是该定时器的ID
使用MFC时就更简单了,我们为其增加WM_TIME的消息处理函数OnTimer即可,请看如下例子
 
void CTimerTestDlg::OnTimer(UINT nIDEvent)
{

switch (nIDEvent)
{

case 24: ///



处理ID为24的定时器

   Draw1();
   break;
case 25: ///

处理ID为25的定时器
   Draw2();
   break;
}
CDialog::OnTimer(nIDEvent);
}





当你用回调函数时,我们可以根据nTimerid的值来判断是哪个定时器,例如:
void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)
{

   switch(nTimerid)
   {

   case 1: ///处理ID为1的定时器





         Do1();
         break;
   case 2: ///

处理ID为2的定时器
         Do2();
         break;
   }
}




三、取消定时器




不再使用定时器后,我们应该调用KillTimer来取消定时,KillTimer的原型如下

BOOL KillTimer(
HWND hWnd,          // 窗口句柄

UINT_PTR uIDEvent   // ID
);


在MFC程序中我们可以直接调用KillTimer(int nIDEvent)来取消定时器。

如:KillTimer(1);

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/211295.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午10:45
下一篇 2026年3月18日 下午10:46


相关推荐

  • JavaScript异步加载

    JavaScript异步加载同步加载的问题 默认的 js 是同步加载的 这里的 加载 可以理解成是解析 执行 而不是 下载 在最新版本的浏览器中 浏览器对于代码请求的资源都是瀑布式的加载 而不是阻塞式的 但是 js 的执行总是阻塞的 这会引起什么问题呢 如果我的 index 页面要加载一些 js 但是其中的某个请求迟迟得不到响应 于是阻塞了后面的 js 代码的执行 同步加载 同时页面渲染也不能继续 如果 js 引入是在 head 标签后

    2026年3月18日
    2
  • 从“理解”到“行动力”,阿里云的智能体生态

    从“理解”到“行动力”,阿里云的智能体生态

    2026年3月16日
    3
  • JVM架构和GC垃圾回收机制(JVM面试不用愁)[通俗易懂]

    JVM架构和GC垃圾回收机制(JVM面试不用愁)[通俗易懂]JVM架构和GC垃圾回收机制详解JVM架构图分析下图:参考网络+书籍,如有侵权请见谅(想了解Hadoop内存溢出请看:Hadoop内存溢出(OOM)分类、参数调优化)JVM被分为三个主要的子系统(1)类加载器子系统(2)运行时数据区(3)执行引擎1.类加载器子系统Java的动态类加载功能是由类加载器子系统处理。当它在运行时(不是编译时)首次引用一个类时,它加载、链…

    2022年4月28日
    59
  • 删除链表倒数第n个节点_单向链表删除倒数第n节点

    删除链表倒数第n个节点_单向链表删除倒数第n节点原题链接给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。进阶:你能尝试使用一趟扫描实现吗?示例 1:输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]示例 2:输入:head = [1], n = 1输出:[]示例 3:输入:head = [1,2], n = 1输出:[1]提示:链表中结点的数目为 sz1 <= sz <= 300 <= Node.val <= 1001 <= n <= s

    2022年8月8日
    8
  • Idea激活码最新教程2019.1.4版本,永久有效激活码,亲测可用,记得收藏

    Idea激活码最新教程2019.1.4版本,永久有效激活码,亲测可用,记得收藏Idea 激活码教程永久有效 2019 1 4 激活码教程 Windows 版永久激活 持续更新 Idea 激活码 2019 1 4 成功激活

    2025年5月24日
    4
  • SSL之CA证书颁发机构安装图文详解[通俗易懂]

    SSL之CA证书颁发机构安装图文详解[通俗易懂]上一节我们说到,在验证公钥安全性时,是在CA机构颁发的包含用户的公钥及其身份信息的数字证书,数字证书由权威机构——CA签发。这个CA权威机构可以是自己的服务器也可以是国际公认的CA权威机构。下面我就来

    2022年8月5日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号