周期性的发送WWL_TIMER消息的一个东西,这个周期可以由程序员自己设定。
设定周期的数是SetTimer,停止定时器消息发送的函数是:Killximer;

定时器消息的特点:

1.不准确(也就是说,你设定的周期是1秒,那么有可能在980毫秒的时候,这个WM_TIMER消息就来了,也有可能1010毫秒的时候才来)
2.可能被合并(这个和WL_PAINT消息类似);

SetTimer
UINT_PTR WINAPI SetTimer(
_In_opt_ HWND hWnd,
_In_ UINT_PTR nIDEvent,
_In_ UINT uElapse,
_In_opt_ TIMERPROC lpTimerFunc
);

hWnd:  指向一个和定时器关联的窗口。如果想改变一个窗口原有定时器的周期,那么这个bwnd必须传递NULL。

nIDEvent: 定时器的标识;

uElapse:   定义周期(毫秒)

lpTimerFunc:指向一个函数的指针,如果这个函数指针是NULL,那么定时器周期性发送WA_TIMER消息给窗口,否则,定时器周期性的调用这个函数,不再发送WM_TIMER消息。函数原型:

TimerProc
VOID CALLBACK TimerProc(
_In_ HWND hwnd,
_In_ UINT uMsg,
_In_ UINT_PTR idEvent,
_In_ DWORD dwTime
);

hwnd:  和定时器相关联的窗口

uMsg:     L_TIMER

idEvent:    定时器标识

dwTime:   系统启动后,运行了多长时间(毫秒)

KillTimer
BOOL WINAPI KillTimer(
_In_opt_ HWND hWnd,
_In_ UINT_PTR uIDEvent
);

hwnd:和定时器关联的窗口;

uIDEvent:定时器标识;

WM_TIMER

wParam:定时器标识
lParam:  指向回调函数 TimerProc的指针

实现定时器源码——法一:WM_TIMER

 #include<Windows.h>
#include<WinUser.h>
#include<tchar.h>
#include<stdio.h> #define SECOND 1000
#define MINUTE 60000
#define HOUR 3600000 LRESULT CALLBACK WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); int WinMain(HINSTANCE hInst, HINSTANCE tmp, LPSTR szCmd, int nShow)
{
WNDCLASS WndClass;
TCHAR* ClassName = TEXT("MyClass");
HWND hwnd;
MSG msg; WndClass.cbClsExtra = ;
WndClass.cbWndExtra = ;
WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + );
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClass.hInstance = hInst;
WndClass.lpfnWndProc = WindProc;
WndClass.lpszClassName = ClassName;
WndClass.lpszMenuName = NULL;
WndClass.style = CS_VREDRAW | CS_HREDRAW; RegisterClass(&WndClass);
hwnd = CreateWindow(ClassName, TEXT("Hello"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, , , NULL, NULL, hInst, NULL);
ShowWindow(hwnd, nShow);
UpdateWindow(hwnd); while (GetMessage(&msg, NULL, , ))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return ;
}
LRESULT CALLBACK WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT pt;
static int second, minute, hour;
static TCHAR str[] = { };
switch (message)
{
case WM_CREATE:
SetTimer(hwnd, , SECOND, NULL);
SetTimer(hwnd, , MINUTE, NULL);
SetTimer(hwnd, , HOUR, NULL);
second = ;
minute = ;
hour = ;
return ;
case WM_SIZE:
return ;
case WM_PAINT:
hdc = BeginPaint(hwnd, &pt);
Rectangle(hdc, , , , );
_stprintf(str, TEXT("%d:%d:%d"), hour, minute, second);
TextOut(hdc, , , str, _tcslen(str));
EndPaint(hwnd, &pt);
return ;
case WM_TIMER:
if (wParam == )
{
second++;
second = second >= ? : second;
}
else if (wParam == )
{
minute++;
minute = minute >= ? : minute;
}
else
hour++;
InvalidateRect(hwnd, NULL, TRUE);
return ;
case WM_DESTROY:
KillTimer(hwnd, );
KillTimer(hwnd, );
KillTimer(hwnd, );
PostQuitMessage();
return ;
default:
break;
} return DefWindowProc(hwnd, message, wParam, lParam);
}

实现定时器源码——法二:TimerProc

 #include<Windows.h>
#include<WinUser.h>
#include<tchar.h>
#include<stdio.h> #define SECOND 1000
#define MINUTE 60000
#define HOUR 3600000
int second, minute, hour; LRESULT CALLBACK WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
VOID CALLBACK TimerProc(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime); int WinMain(HINSTANCE hInst, HINSTANCE tmp, LPSTR szCmd, int nShow)
{
WNDCLASS WndClass;
TCHAR* ClassName = TEXT("MyClass");
HWND hwnd;
MSG msg; WndClass.cbClsExtra = ;
WndClass.cbWndExtra = ;
WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + );
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClass.hInstance = hInst;
WndClass.lpfnWndProc = WindProc;
WndClass.lpszClassName = ClassName;
WndClass.lpszMenuName = NULL;
WndClass.style = CS_VREDRAW | CS_HREDRAW; RegisterClass(&WndClass);
hwnd = CreateWindow(ClassName, TEXT("Hello"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, , , NULL, NULL, hInst, NULL);
ShowWindow(hwnd, nShow);
UpdateWindow(hwnd); while (GetMessage(&msg, NULL, , ))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return ;
}
LRESULT CALLBACK WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT pt;
static TCHAR str[] = { };
switch (message)
{
case WM_CREATE:
SetTimer(hwnd, , SECOND, TimerProc);
SetTimer(hwnd, , MINUTE, TimerProc);
SetTimer(hwnd, , HOUR, TimerProc);
second = ;
minute = ;
hour = ;
return ;
case WM_SIZE:
return ;
case WM_PAINT:
hdc = BeginPaint(hwnd, &pt);
Rectangle(hdc, , , , );
_stprintf(str, TEXT("%d:%d:%d"),hour, minute, second);
TextOut(hdc, , , str, _tcslen(str));
EndPaint(hwnd, &pt);
return ;
case WM_DESTROY:
KillTimer(hwnd, );
KillTimer(hwnd, );
KillTimer(hwnd, );
PostQuitMessage();
return ;
default:
break;
} return DefWindowProc(hwnd, message, wParam, lParam);
} VOID CALLBACK TimerProc(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
if (idEvent == )
{
second++;
second = second >= ? : second;
}
else if (idEvent == )
{
minute++;
minute = minute >= ? : minute;
}
else
hour++;
InvalidateRect(hWnd, NULL, TRUE);
}

11 Windows编程——定时器的更多相关文章

  1. 【Windows编程】系列第五篇:GDI图形绘制

    上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数 ...

  2. Direct3D 10学习笔记(四)——Windows编程

    本篇将简单整理基本的Windows应用程序的实现,并作为创建Direct3D 10应用程序的铺垫.具体内容参照< Introduction to 3D Game Programming with ...

  3. 设置windows窗口ICON 【windows 编程】【API】【原创】

    1. ICON介绍 最近开始接触windows 编程,因此将自己所接触的一些零散的知识进行整理并记录.本文主要介绍了如何更改windows对话框窗口的ICON图标.这里首先介绍一下windows IC ...

  4. MoreWindows 微软认证专家博客目录(白话算法,C++ STL,windows编程)

    为了方便大家查找和学习,现将本人博客中所有博客文章列出目录. (http://blog.csdn.net/morewindows) 一.      白话经典算法 目前有17篇,分为七大排序和经典面试题 ...

  5. windows编程中的数据类型

    在windows编程中,有许多奇怪的数据类型,初学者不知道这些代表什么,下面就把一些数据类型列出如下: ATOM 原子(原子表中的一个字符串的参考) BOOL 布尔变量 BOOLEAN 布尔变量 BY ...

  6. Windows编程 Windows程序的生与死(中)

    <pre style=""><pre class="cpp" name="code">1 #include < ...

  7. Windows编程 Windows程序的生与死(上)

    引子 “Windows 程序分为‘程序代码’和‘UI(User Interface)资源’两大部份,两部份最后以RC编译器(资源编译器)整合为一个完整的EXE 文件.所谓UI 资源是指功能菜单.对话框 ...

  8. 资源在windows编程中的应用----菜单

    资源在Windows编程中的应用 资源 加速键.位图.光标.对话框.菜单.字符串.工具条 1.菜单的创建 菜单由以下组成部分: (1)窗口主菜单条 (2)下拉式菜单框 (3)菜单项热键标识 (4)菜单 ...

  9. 【Windows编程】系列第六篇:创建Toolbar与Statusbar

    上一篇我们学习了解了如何使用Windows GDI画图,该应用程序都是光光的静态窗口,我们使用Windows应用程序,但凡稍微复杂一点的程序都会有工具栏和状态栏,工具栏主要用于一些快捷功能按钮.比如典 ...

随机推荐

  1. laravel中redis pipeline用法说明

    $res = Redis::pipeline(function($pipe) use($params) { for ($i = 0; $i < 1000; $i++) { $pipe->g ...

  2. 01.轮播图之二 :tableView 轮播

    在做这个tablevew轮播的时候,重要的就是修改frame 和view 的翻转了:::: 也是不难的,概要的设计和scroll 轮播是一致的: 首先是 .h 的文件 @interface Table ...

  3. RISC-V汇编指南

    原文出处:https://github.com/riscv/riscv-asm-manual/blob/master/riscv-asm.md RISC-V Assembly Programmer's ...

  4. linux下使用Oracle常用命令

    进入Oracle用户 su - oracle 以dba身份进入sql语句 sqlplus / as sysdba 启动数据库相关命令启动数据库 startup 启动监听(关闭监听的命令lsnrctl ...

  5. SrpingBoot入门到入坟04-配置文件

    SpringBoot使用一个全局的配置文件,名称是固定,作用就是修改SpringBoot自动配置的默认值. *application.properties *application.yml 先看看两者 ...

  6. 开源定时任务框架Quartz(二)

    概述 上一篇文章完成了第一个Quartz程序的编写,这篇从Quartz中的几个重要对象来更深一层认识Quartz框架. Job和JobDetail Job是Quartz中的一个接口,接口下只有exec ...

  7. Linux下安装redis 3.0及C语言中客户端实现demo

    1.获取安装文件 wget http://download.redis.io/redis-stable.tar.gz 2.解压文件 tar xzvf redis-stable.tar.gz 3.进入目 ...

  8. HNUSTOJ-1617 Graph(费马数)

    1617: Graph 时间限制: 1 Sec  内存限制: 32 MB提交: 31  解决: 5[提交][状态][讨论版] 题目描述 Your task is to judge whether a ...

  9. asp.net MVC 抓取微信文章数据(正文)

    1.抓微信的正文主要是调用第三方的接口(https://market.aliyun.com/products/56928004/cmapi012134.html) using Newtonsoft.J ...

  10. QMap里面的值任然是一个QMap,在做循环插入的时候需要记得清空。

    这个问题是我以前的一个问题,当时由于有其他的事情去处理就忘记了,前段时间我的项目要进行集成测试了,为了避免这个缺陷,只能再把这个问题想起来了,再进行解决.有很多问题你觉得不应该发生,其实很多时候都是逻 ...