首页 > 其他分享 >win32开发(定时器)

win32开发(定时器)

时间:2022-11-23 13:09:33浏览次数:52  
标签:break 定时器 hWnd WM win32 KillTimer 开发 SetTimer




    要说除了鼠标、键盘消息之外,还有什么消息最重要。我想大概是就是定时器了。这定时器可长可短,如果是短定时器的话,那么就可以形成动画,记录成视频。如果是长定时器的话,那么就是普通的定时时间,代码按时进行处理就好了。举个例子来说,大家熟悉的tcp/ip网络看起来复杂,其实深究下去也就是状态机、定时器、校验码、出错重传、拥塞控制这些基本构件,其中定时器就发挥了巨大的作用。


    要说在win32上怎么使用定时器,其实也不难,主要是SetTimer和KillTimer这两个函数。SetTimer有四个参数,第一参数是窗口句柄,第二个参数是timer的id好,这个可以自己设置,第三个参数是定时时间,第四个是定时器的回调函数,如果此函数没有,那么os会给窗口发送一个WM_TIMER的消息。KillTimer就更简单了,它有两个参数,第一个参数是窗口句柄,第二个参数就是timer的id号。SetTimer是开启定时器,KillTimer是关闭定时器。如果没有调用KillTimer的话,那么WM_TIMER消息就会定时发送一遍。


    所以,了解了定时器的基本函数之后,我们就明白定时器基本的处理逻辑是这样的,


case WM_CREATE:
SetTimer(hWnd, 5000, 2000, NULL);
break;

case WM_TIMER:
KillTimer(hWnd, 5000);
MessageBox(NULL,"timer", "tips", NULL);
break;


    当然,利用定时器弹出窗口,这本身没有什么创意。我们可以做一点有意思的代码。比如说,我们可以利用定时器定时在app打印出数据出来,比如说打印出一个不断在变化的数字就可以了,所以首先我们把定时器修改一下,


case WM_CREATE:
SetTimer(hWnd, 5000, 1000, NULL);
break;

case WM_TIMER:
InvalidateRect(hWnd, NULL, 0);
break;

    大家可以看一下这里修改后的代码,首先定时的时间也变短了,从2s变成了1s。其次,代码删除了KillTimer的动作,这样可以保证timer一直执行下去,达到我们不断输出新数字的目的。接着,就该修改一下WM_PAINT下面的代码了,


case WM_PAINT:
g_text += 1;
buffer[9] = '\0';
_snprintf(buffer, 10, "%d", g_text);
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
RECT rt;
GetClientRect(hWnd, &rt);
DrawText(hdc, buffer, strlen(buffer), &rt, DT_CENTER);
EndPaint(hWnd, &ps);
break;

    大家发现,我们每次需要重新绘图的时候,都是调用InvalidateRect来完成的。通过这个function,os就会给app发送WM_PAINT消息,我们自己需要做的就是处理这个消息就可以了。注意,这里的g_text是一个全局变量,_snprintf的工作则是将数字变成字符串,最后调用DrawText将字符串输出到屏幕上,这样整个工作基本上就完成了。


标签:break,定时器,hWnd,WM,win32,KillTimer,开发,SetTimer
From: https://blog.51cto.com/feixiaoxing/5880992

相关文章

  • win32开发(图形绘制)
      在win32上面绘制图形其实是比较简单的。要想进行图形绘制,关键是找到设备上下文。就我目前所知道的,获得设备上下文主要有这么几种方式:一、根据BeginPaint获得设备上下......
  • win32开发(按键消息)
      对于一个应用来说,按键和鼠标都是基本的消息。当然,win32也需要独立处理按键消息和鼠标消息。今天,我们就讨论一下按键消息。一般认为,当键盘上一个key按下去之后,os会给ap......
  • win32开发(调试)
      很多同学都喜欢看代码,但是不喜欢调试代码。其实,在我看来,调试代码本身也是一项重要的能力。一份代码,如果没有经过反复调试和验证,很难说自己是不是理解得够深刻。同样对......
  • win32开发(简单绘图)
      在win32上面,所有的操作都是通过消息来完成的。正如前面一节说的那样,WM_CREATE、WM_PAINT、WM_SIZE、WM_DESTROY、WM_CHAR等消息都是我们在开发中经常要遇到的消息内容......
  • win32开发(添加菜单)
      使用win32编写菜单是一件很简单的事情。要添加自己的菜单,其实只要做好两方面的事情就可以了,一个就是在ResourceView中找到菜单入口,另外一个就是在WndProc添加好回调函......
  • 嵌入式操作系统内核原理和开发(总结篇)
      很多朋友都喜欢嵌入式操作系统的内容,但是如何实现和仿真这样一个系统一直是困扰我们的难题。现在郑重推荐一下raw-os系统,在我们的博客当中也多次提到了这个代码,希望大......
  • 嵌入式操作系统内核原理和开发(实时调度)
      和很多通用的操作系统相比,实时操作系统有自己的一个特点,那就是实时调度。通用操作系统的线程优先级一般是可以变化的,而实时系统的线程优先级却是不变的。之所以这么......
  • 嵌入式操作系统内核原理和开发(消息队列)
         消息队列是线程交互的一种方法,任务可以通过消息队列来实现数据的沟通和交换。在嵌入式系统上,这可以说这是用的最多的一种方法。通过消息队列,无论是发送者,还是接......
  • 嵌入式操作系统内核原理和开发(事件)
      在很多操作系统的书上,其实互斥和同步是放在一起进行介绍的。互斥,比较简单,就是对某一份资源或者几份资源进行抢占获取。而同步是什么意思呢,就是某一个线程等待另外一个......
  • 嵌入式操作系统内核原理和开发(地址空间)
      不管是什么样的嵌入式cpu,它必然有自己的访问地址空间。至于这个具体的访问空间是什么,那cpu就不知道了。它可以是ram,当然也可以是flash、uart、ide、i2c等。当然cpu不......