Windows API 使用 SetTimer 定时器来持续画图

在Windows API中,SetTimer 函数用于在指定的窗口上设置一个定时器。当定时器到期时,窗口会收到一个WM_TIMER消息。以下是SetTimer函数的详细解释和用法:

函数原型

UINT_PTR SetTimer(HWND       hWnd,             // 窗口句柄UINT_PTR   nIDEvent,         // 定时器标识符UINT       uElapse,          // 定时器的时间间隔(毫秒)TIMERPROC  lpTimerFunc       // 定时器回调函数(可选)
);

参数

  • hWnd:接收WM_TIMER消息的窗口句柄。如果此参数为NULL,则lpTimerFunc必须是一个有效的回调函数地址,并且WM_TIMER消息将被发送到调用线程的消息队列中,而不是发送到特定的窗口。
  • nIDEvent:定时器的标识符。如果此参数设置为0,系统将为定时器提供一个唯一的标识符。
  • uElapse:定时器的时间间隔(以毫秒为单位)。当经过指定的时间间隔后,定时器到期,并发送WM_TIMER消息。
  • lpTimerFunc:一个指向回调函数的指针,当定时器到期时,该函数将被调用。此参数是可选的,如果为NULL,则当定时器到期时,将发送WM_TIMER消息到指定的窗口。

返回值

如果函数成功,返回值是定时器的标识符。如果函数失败,返回值是0。要获取扩展的错误信息,请调用GetLastError

示例

下面是一个简单的示例,展示了如何在Windows应用程序中使用SetTimer

#include <windows.h>LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{switch (uMsg){case WM_TIMER:// 定时器到期时执行的代码// wParam 包含定时器的标识符// 在这里,你可以更新UI、执行某些操作等break;case WM_DESTROY:// 销毁窗口时,取消定时器KillTimer(hwnd, 1); // 假设定时器的标识符是1PostQuitMessage(0);break;default:return DefWindowProc(hwnd, uMsg, wParam, lParam);}return 0;
}int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{// ... 创建窗口等代码 ...// 设置一个定时器,每1000毫秒(1秒)到期一次SetTimer(hwnd, 1, 1000, NULL);// ... 消息循环等代码 ...return 0;
}

注意事项

  • 当不再需要定时器时,应使用KillTimer函数来取消它,以避免不必要的资源消耗。
  • 如果hWnd参数为NULL,并且lpTimerFunc不为NULL,则WM_TIMER消息将被发送到调用线程的消息队列中,而不是发送到特定的窗口。在这种情况下,你需要使用GetMessagePeekMessage等函数来检索这些消息。
  • 定时器精度取决于系统时钟的分辨率,因此不应用于需要高精度计时的场景。如果需要高精度计时,请考虑使用其他方法,如QueryPerformanceCounter

举例

在Windows编程中,SetTimer函数用于设置一个定时器,该定时器在指定的时间间隔后触发一个WM_TIMER消息到指定的窗口。TIMERPROC是一个回调函数类型,但通常用于SetTimer的异步版本SetWaitableTimer,而不是SetTimer。然而,对于SetTimer,你不需要提供TIMERPROC类型的回调函数,因为SetTimer是通过发送WM_TIMER消息来通知你的窗口的。

以下是使用SetTimer的基本步骤:

  1. 在你的窗口的WM_CREATE消息处理程序中设置定时器。
  2. 在你的窗口的WM_TIMER消息处理程序中处理定时器事件。
  3. (可选)在你的窗口的WM_DESTROY或适当的消息处理程序中删除定时器。

下面是一个简单的示例代码:

#include <windows.h>// 定时器ID(可以是任何非零值)
#define TIMER_ID 1// 窗口过程函数
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{switch (uMsg){case WM_CREATE:// 设置一个定时器,每1000毫秒(1秒)触发一次SetTimer(hwnd, TIMER_ID, 1000, NULL);break;case WM_TIMER:// 检查是否是我们的定时器触发的消息if (wParam == TIMER_ID){// 在这里处理定时器事件,比如重绘窗口的部分内容// ...// (可选)如果不再需要定时器,可以调用KillTimer来删除它}break;case WM_DESTROY:// 销毁窗口时删除定时器KillTimer(hwnd, TIMER_ID);PostQuitMessage(0);break;default:return DefWindowProc(hwnd, uMsg, wParam, lParam);}return 0;
}// WinMain函数(这里只给出了框架)
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{// ... 窗口类注册、窗口创建等代码 ...// 进入消息循环MSG msg;while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;
}

在这个示例中,我们在窗口创建时设置了一个定时器,该定时器每1秒触发一次WM_TIMER消息。在WM_TIMER消息处理程序中,我们检查是否是我们的定时器触发的消息,并执行相应的操作(在这个例子中,我们只是注释了这部分,但你可以添加你自己的代码来重绘窗口的部分内容或执行其他任务)。当窗口销毁时,我们删除定时器以防止内存泄漏。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/23312.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python邮件群发有哪些步骤?如何批量发送?

Python邮件群发的注意事项&#xff1f;怎么使用Python群发邮件&#xff1f; 使用Python进行邮件群发&#xff0c;不仅可以自动化流程&#xff0c;还可以节省大量的时间和精力。AokSend将详细介绍使用Python进行邮件群发的步骤&#xff0c;并在过程中提供实用的建议和注意事项。…

windows下使用命令清空U盘

1、CMD命令打开后输入diskpart命令打开磁盘分区管理工具 diskpart打开如下窗口 Microsoft DiskPart 版本 10.0.19041.3636 Copyright (C) Microsoft Corporation. 在计算机上: DESKTOP-TR9HQRP 2、输入查看所有磁盘命令 list disk打印如下windows 磁盘 ###  状态    …

机械臂码垛机:解读其高效作业与灵活性

在当今高度自动化的工业时代&#xff0c;机械臂码垛机以其高效作业和灵活性&#xff0c;成为了生产线上的得力助手。这款设备不仅大幅提升了生产效率&#xff0c;还显著降低了人工操作的强度和风险&#xff0c;为现代工业发展注入了强大的动力。 机械臂码垛机的高效作业能力令人…

Spring Cloud微服务架构下的安全通信、系统稳定性和扩展性

Spring Cloud是一个为分布式系统提供集成解决方案的框架&#xff0c;广泛应用于微服务架构中。在微服务架构下&#xff0c;服务与服务之间的通信是至关重要的&#xff0c;而确保这种通信的安全性、提高系统的稳定性和扩展性则是系统设计中的关键考虑因素。本文将探讨在Spring C…

【机器学习】必会降维算法之:奇异值分解(SVD)

奇异值分解&#xff08;SVD&#xff09; 1、引言2、奇异值分解&#xff08;SVD&#xff09;2.1 定义2.2 应用场景2.3 核心原理2.4 算法公式2.5 代码示例 3、总结 1、引言 一转眼&#xff0c; 小屌丝&#xff1a;鱼哥&#xff0c;就要到每年最开心的节日了&#xff1a;六一儿童…

搭建Vulnhub靶机网络问题(获取不到IP)

搭建好靶场后&#xff0c;在攻击机运行arp-scan -l无法发现靶机IP。 这时候去看下靶机网络有没有问题。 重新启动客户机&#xff0c;一直按e进入安全模式&#xff08;要是直接开机了就先按shift进入grub界面&#xff0c;再按e&#xff09;找到ro&#xff0c;将ro改为rw signie…

XM平台的交易模式模式是什么?

外汇交易平台的盈利模式主要分为两种&#xff1a;有交易员平台和无交易员平台。 有交易员平台&#xff0c;也称为做市商平台&#xff0c;为客户提供交易市场&#xff0c;并在需要时与客户持相反方向的交易&#xff0c;从中赚取利润。交易者看到的买入卖出价可能与实际价格不同&…

python 巡检报告中的邮件处理

00.创作背景,在每天的巡检报告中要 要检查oa相关服务器的备份作业是否备份成功 那个备份软件有个功能&#xff0c;就是完成备份作业后&#xff0c;可以发送信息到我的邮箱。 01.通过检查我邮箱的信息&#xff0c;就可以了解那个备份作业的情况。 通过解释邮件的名称可以了解备…

Cassandra的基本概念以及对比SQL server中的概念进行理解

Cassandra是一个开源的分布式NoSQL数据库系统&#xff0c;它最初由Facebook开发&#xff0c;并因其高可扩展性、容错性和灵活性而被广泛应用于各种场景中。以下是Cassandra中的一些基本概念&#xff0c;以及与Microsoft SQL Server中的概念进行对比&#xff1a; Cassandra基本…

一分钟学习数据安全—自主管理身份SSI架构

上一篇我们概要介绍了SSI的几个组成部分&#xff0c;包括可验证凭证信任三角、治理框架等&#xff0c;后面的介绍文章我们将分别介绍一下相关的技术。 SSI的堆栈演进到现在&#xff0c;综合整个生态中的关键架构决策&#xff0c;普遍接受的是一个四层模型。 如上图所示&#xf…

如何将多个jtl文件合并到一个,并且生成html报告

项目背景&#xff1a; 使用jmeterjenkins做自动化测试&#xff0c;不同业务写在不同的jmx文件中&#xff0c;现在需要生成一份汇总的报告。 多个脚本&#xff0c;A.jtl,B.jtl,C.jtl,D.jtl..&#xff0c;需要将这些jtl文件生成一个html文件 1.创建汇总文件merged.jtl文件&…

mysql 拼接字段+根据特定值返回特定内容

1、这里&#xff0c;首选实现根据特定值返回特定内容&#xff0c;使用 case case when r.Namedemand then 采购商when r.Namesupplier then 供应商else 未知 end as roleName2、然后使用Group_Concat函数 group_concat((case when r.Namedemand then 采购商when r.Namesu…

Windows Docker手动迁移镜像

1 将镜像保存至本地 # docker save 镜像名称:版本号 > 镜像名称.tar (windows迁移windows使用 迁移到linux会报错archive/ tar : invalid tar header) docker save --outputC:\YOUR_PATH\my_docker_image.tar image_id 例如&#xff1a;docker save --outputD:\moviepilot…

论程序员的职业素养

文章目录 前言一、命名规范1. HTML命名规范2. CSS命名规范3. JavaScript命名规范4. 文件和文件夹命名规范5. 代码案例 二、代码注释规范1. 注释规范2. 案例代码HTMLCSS (styles/main.css)JavaScript (scripts/main.js) 三、代码逻辑规范1.逻辑规范2. 代码案例清晰的函数和模块化…

QT系列教程(8) QT 布局学习

简介 Qt 中的布局有三种方式&#xff0c;水平布局&#xff0c;垂直布局&#xff0c;栅格布局。 通过ui设置布局 我们先创建一个窗口应用程序&#xff0c;程序名叫layout&#xff0c;基类选择QMainWindow。但我们不使用这个mainwindow&#xff0c;我们创建一个Qt应用程序类Log…

使用API有效率地管理Dynadot域名,删除已设置的文件夹

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

河南省第十四届ICPC大学生程序设计竞赛-C结对编程

题面 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 524288K&#xff0c;其他语言1048576K 64bit IO Format: %lld 题目描述 A公司是一家主营软件开发的公司。公司内有n名员工&#xff0c;编号为1到n的整数&#xff0c;除了1号老板外每名员工…

用友NC downCourseWare 任意文件读取漏洞复现

0x01 产品简介 用友NC是一款企业级ERP软件。作为一种信息化管理工具,用友NC提供了一系列业务管理模块,包括财务会计、采购管理、销售管理、物料管理、生产计划和人力资源管理等,帮助企业实现数字化转型和高效管理。 0x02 漏洞概述 用友NC 系统 /portal/pt/downCourseWare…

PDF格式分析(八十四)——小部件注释(Widget)

小部件注释(PDF1.2及其以上版本),用于表示交互式表单的外观,并管理其与用户的交互。为了方便,当field仅与单个小部件注释相关联时,field词典会与annotation字典合并成一个字典,该字典既有field字典的条目,也有annotation字典的条目。 下表显示Widget注释字典的条目: 条…

【Go】编码结构体转换为json字符串

结构体内字段命名大小写问题导致无法解析到 package mainimport ("encoding/json""fmt" ) // 定义一个结构体 type Music struct {name string json:"名称" // 字段大小写命名问题&#xff01;&#xff01;&#xff01;singer string json:&q…