周期性的发送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. Spring Boot学习笔记——Spring Boot与MyBatis的集成(项目示例)

    1.准备数据库环境 # 创建数据库 CREATE DATABASE IF NOT EXISTS zifeiydb DEFAULT CHARSET utf8 COLLATE utf8_general_c ...

  2. iOS-UINavigationController多控制器管理

    UINavigationController 7.8.1 添加子控制器进栈 UINavigationController *nav = [[UINavigationController alloc]  ...

  3. maven项目创建.m2文件夹

    创建为.m2.,m2前后都要有点,然后去掉后面的点 settings.xml文件如下: <?xml version="1.0" encoding="UTF-8&qu ...

  4. 终端、虚拟终端、shell、控制台、tty的区别

    终端与控制台的区别? 最近开始接触Linux,终端.虚拟终端.shell.控制台.tty等概念让我很混乱,有必要认识清楚. 今天看到有人问终端和控制台的区别,而且这个问题比较有普遍性,因此想抽出一点时 ...

  5. 20175316盛茂淞 2018-2019-2 《Java程序设计》第10周学习总结

    教材知识总结 第12章 Java多线程机制 进程与线程 进程是程序的一次动态执行进程,它对应了从代码加载.执行至执行完毕的一个完整过程 线程不是进程,一个进程在其执行过程中,会产生多个线程,线程间可以 ...

  6. 菜单特效jq

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. 路由器01---k2刷Pandora

    1.固件 固件(Firmware)就是写入EPROM(可擦写可编程只读存储器)或EEPROM(电可擦可编程只读存储器)中的程序. 对于独立可操作的电子产品,固件一般指它的操作系统(“担任着一个数码产品 ...

  8. WIN10更换无线网卡后WIFI无法正常启用

    这里根据自己经历提供几个方案: 首先我们要确定这两个地方正常(表示网卡能识别.驱动安装好:有无线开关没打开的朋友请出门右转): 方案一:万能的重启,不觉得麻烦的就多重启几遍.大力出奇迹! 方案二:然后 ...

  9. Django导出数据为Excel,调用浏览器下载

    1. 环境 Django (2.1.10) + Python3.6 + xlwt (1.3.0) 操作系统使用的为:Windows 7 2. 接口代码 def now_export(request): ...

  10. PAT(B) 1017 A除以B(Java)

    题目链接:1017 A除以B 分析 读取输入的A和B后,保存为字符串.模拟除法运算过程. 不要用BigInteger,因为会超时. 另外字符串经常要扩展(例如:append())的话,不要用Strin ...