Windows程序设计-定时器
来源:互联网 发布:淘宝文玩核桃 编辑:程序博客网 时间:2024/06/05 20:25
应用
- 计时程序
- 多任务
- 维护更新过的状态报,实时更新
- 自动储存
- 终止程序展示版本的执行
- 步进移动
- 多媒体
三种方法
方法一
SetTimer (hwnd, 1, uiMsecInterval, NULL) ;
第一个参数是其窗口消息处理程序将接收WM_TIMER消息的窗口句柄。第二个参数是定时器ID,它是一个非0数值,在整个例子中假定为1。第三个参数是一个32位无正负号整数,以毫秒为单位指定一个时间间隔,一个60,000的值将使Windows每分钟发送一次WM_TIMER消息。
停止WM_TIMER消息:
KillTimer (hwnd, 1) ;
此函数的第二个参数是SetTimer呼叫中所用的同一个定时器ID。在终止程序之前,您应该响应WM_DESTROY消息停止任何活动的定时器。
方法二:回调函数
SetTimer (hwnd, iTimerID, iMsecInterval, TimerProc) ;
方法三
设定定时器的第三种方法类似于第二种方法,只是传递给SetTimer的hwnd参数被设定为NULL,并且第二个参数(通常为定时器ID)被忽略了,最后,此函数传回定时器ID。
iTimerID = SetTimer (NULL, 0, wMsecInterval, TimerProc) ;
KillTimer (NULL, iTimerID) ;
定时器用于时钟
/*----------------------------------------------------------------------------DIGCLOCK.C -- Digital Clock(c) Charles Petzold, 1998----------------------------------------------------------------------------*/#include <windows.h>#define ID_TIMER 1LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ static TCHAR szAppName[] = TEXT("DigClock"); HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; if (!RegisterClass(&wndclass)) { MessageBox(NULL, TEXT("Program requires Windows NT!"), szAppName, MB_ICONERROR); return 0; } hwnd = CreateWindow(szAppName, TEXT("Digital Clock"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam;}void DisplayDigit(HDC hdc, int iNumber){ static BOOL fSevenSegment[10][7] = { 1, 1, 1, 0, 1, 1, 1, // 0 0, 0, 1, 0, 0, 1, 0, // 1 1, 0, 1, 1, 1, 0, 1, // 2 1, 0, 1, 1, 0, 1, 1, // 3 0, 1, 1, 1, 0, 1, 0, // 4 1, 1, 0, 1, 0, 1, 1, // 5 1, 1, 0, 1, 1, 1, 1, // 6 1, 0, 1, 0, 0, 1, 0, // 7 1, 1, 1, 1, 1, 1, 1, // 8 1, 1, 1, 1, 0, 1, 1 }; // 9 static POINT ptSegment[7][6] = { 7, 6, 11, 2, 31, 2, 35, 6, 31, 10, 11, 10, 6, 7, 10, 11, 10, 31, 6, 35, 2, 31, 2, 11, 36, 7, 40, 11, 40, 31, 36, 35, 32, 31, 32, 11, 7, 36, 11, 32, 31, 32, 35, 36, 31, 40, 11, 40, 6, 37, 10, 41, 10, 61, 6, 65, 2, 61, 2, 41, 36, 37, 40, 41, 40, 61, 36, 65, 32, 61, 32, 41, 7, 66, 11, 62, 31, 62, 35, 66, 31, 70, 11, 70 }; int iSeg; for (iSeg = 0; iSeg < 7; iSeg++) if (fSevenSegment[iNumber][iSeg]) Polygon(hdc, ptSegment[iSeg], 6);}void DisplayTwoDigits(HDC hdc, int iNumber, BOOL fSuppress){ if (!fSuppress || (iNumber / 10 != 0)) DisplayDigit(hdc, iNumber / 10); OffsetWindowOrgEx(hdc, -42, 0, NULL); DisplayDigit(hdc, iNumber % 10); OffsetWindowOrgEx(hdc, -42, 0, NULL);}void DisplayColon(HDC hdc){ POINT ptColon[2][4] = { 2, 21, 6, 17, 10, 21, 6, 25, 2, 51, 6, 47, 10, 51, 6, 55 }; Polygon(hdc, ptColon[0], 4); Polygon(hdc, ptColon[1], 4); OffsetWindowOrgEx(hdc, -12, 0, NULL);}void DisplayTime(HDC hdc, BOOL f24Hour, BOOL fSuppress){ SYSTEMTIME st; GetLocalTime(&st); if (f24Hour) DisplayTwoDigits(hdc, st.wHour, fSuppress); else DisplayTwoDigits(hdc, (st.wHour %= 12) ? st.wHour : 12, fSuppress); DisplayColon(hdc); DisplayTwoDigits(hdc, st.wMinute, FALSE); DisplayColon(hdc); DisplayTwoDigits(hdc, st.wSecond, FALSE);}LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ static BOOL f24Hour, fSuppress; static HBRUSH hBrushRed; static int cxClient, cyClient; HDC hdc; PAINTSTRUCT ps; TCHAR szBuffer[2]; switch (message) { case WM_CREATE: hBrushRed = CreateSolidBrush(RGB(255, 0, 0)); SetTimer(hwnd, ID_TIMER, 1000, NULL);// fall through case WM_SETTINGCHANGE: GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_ITIME, szBuffer, 2); f24Hour = (szBuffer[0] == '1'); GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_ITLZERO, szBuffer, 2); fSuppress = (szBuffer[0] == '0'); InvalidateRect(hwnd, NULL, TRUE); return 0; case WM_SIZE: cxClient = LOWORD(lParam); cyClient = HIWORD(lParam); return 0; case WM_TIMER: InvalidateRect(hwnd, NULL, TRUE); return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); SetMapMode(hdc, MM_ISOTROPIC); SetWindowExtEx(hdc, 276, 72, NULL); SetViewportExtEx(hdc, cxClient, cyClient, NULL); SetWindowOrgEx(hdc, 138, 36, NULL); SetViewportOrgEx(hdc, cxClient / 2, cyClient / 2, NULL); SelectObject(hdc, GetStockObject(NULL_PEN)); SelectObject(hdc, hBrushRed); DisplayTime(hdc, f24Hour, fSuppress); EndPaint(hwnd, &ps); return 0; case WM_DESTROY: KillTimer(hwnd, ID_TIMER); DeleteObject(hBrushRed); PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam);}
调用Windows函数GetLocalTime返回SYSTEMTIME格式的当地时间。
SYSTEMTIME st ;GetLocalTime (&st) ;
在WINBASE.H中定义为:
typedef struct _SYSTEMTIME{WORD wYear ;WORD wMonth ;WORD wDayOfWeek ;WORD wDay ;WORD wHour ;WORD wMinute ;WORD wSecond ;WORD wMilliseconds ;}SYSTEMTIME, * PSYSTEMTIME ;
模拟时钟
/*---------------------------------------------------------------------------CLOCK.C -- Analog Clock Program(c) Charles Petzold, 1998---------------------------------------------------------------------------*/#include <windows.h>#include <math.h>#define ID_TIMER 1#define TWOPI (2 * 3.14159)LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ static TCHAR szAppName[] = TEXT("Clock"); HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = NULL; wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; if (!RegisterClass(&wndclass)) { MessageBox(NULL, TEXT("Program requires Windows NT!"), szAppName, MB_ICONERROR); return 0; } hwnd = CreateWindow(szAppName, TEXT("Analog Clock"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam;}void SetIsotropic(HDC hdc, int cxClient, int cyClient){ SetMapMode(hdc, MM_ISOTROPIC); SetWindowExtEx(hdc, 1000, 1000, NULL); SetViewportExtEx(hdc, cxClient / 2, -cyClient / 2, NULL); SetViewportOrgEx(hdc, cxClient / 2, cyClient / 2, NULL);}void RotatePoint(POINT pt[], int iNum, int iAngle){ int i; POINT ptTemp; for (i = 0; i < iNum; i++) { ptTemp.x = (int)(pt[i].x * cos(TWOPI * iAngle / 360) + pt[i].y * sin(TWOPI * iAngle / 360)); ptTemp.y = (int)(pt[i].y * cos(TWOPI * iAngle / 360) - pt[i].x * sin(TWOPI * iAngle / 360)); pt[i] = ptTemp; }}void DrawClock(HDC hdc){ int iAngle; POINT pt[3]; for (iAngle = 0; iAngle < 360; iAngle += 6) { pt[0].x = 0; pt[0].y = 900; RotatePoint(pt, 1, iAngle); pt[2].x = pt[2].y = iAngle % 5 ? 33 : 100; pt[0].x -= pt[2].x / 2; pt[0].y -= pt[2].y / 2; pt[1].x = pt[0].x + pt[2].x; pt[1].y = pt[0].y + pt[2].y; SelectObject(hdc, GetStockObject(BLACK_BRUSH)); Ellipse(hdc, pt[0].x, pt[0].y, pt[1].x, pt[1].y); }}void DrawHands(HDC hdc, SYSTEMTIME * pst, BOOL fChange){ static POINT pt[3][5] = { 0, -150, 100, 0, 0, 600, -100, 0, 0, -150, 0, -200, 50, 0, 0, 800, -50, 0, 0, -200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 800 }; int i, iAngle[3]; POINT ptTemp[3][5]; iAngle[0] = (pst->wHour * 30) % 360 + pst->wMinute / 2; iAngle[1] = pst->wMinute * 6; iAngle[2] = pst->wSecond * 6; memcpy(ptTemp, pt, sizeof (pt)); for (i = fChange ? 0 : 2; i < 3; i++) { RotatePoint(ptTemp[i], 5, iAngle[i]); Polyline(hdc, ptTemp[i], 5); }}LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ static int cxClient, cyClient; static SYSTEMTIME stPrevious; BOOL fChange; HDC hdc; PAINTSTRUCT ps; SYSTEMTIME st; switch (message) { case WM_CREATE: SetTimer(hwnd, ID_TIMER, 1000, NULL); GetLocalTime(&st); stPrevious = st; return 0; case WM_SIZE: cxClient = LOWORD(lParam); cyClient = HIWORD(lParam); return 0; case WM_TIMER: GetLocalTime(&st); fChange = st.wHour != stPrevious.wHour || st.wMinute != stPrevious.wMinute; hdc = GetDC(hwnd); SetIsotropic(hdc, cxClient, cyClient); SelectObject(hdc, GetStockObject(WHITE_PEN)); DrawHands(hdc, &stPrevious, fChange); SelectObject(hdc, GetStockObject(BLACK_PEN)); DrawHands(hdc, &st, TRUE); ReleaseDC(hwnd, hdc); stPrevious = st; return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); SetIsotropic(hdc, cxClient, cyClient); DrawClock(hdc); DrawHands(hdc, &stPrevious, TRUE); EndPaint(hwnd, &ps); return 0; case WM_DESTROY: KillTimer(hwnd, ID_TIMER); PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam);}
以定时器进行状态报告
/*--------------------------------------------------------------------------WHATCLR.C -- Displays Color Under Cursor(c) Charles Petzold, 1998---------------------------------------------------------------------------*/#include <windows.h>#define ID_TIMER 1void FindWindowSize(int *, int *);LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ static TCHAR szAppName[] = TEXT("WhatClr"); HWND hwnd; int cxWindow, cyWindow; MSG msg; WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; if (!RegisterClass(&wndclass)) { MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR); return 0; } FindWindowSize(&cxWindow, &cyWindow); hwnd = CreateWindow(szAppName, TEXT("What Color"), WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_BORDER, CW_USEDEFAULT, CW_USEDEFAULT, cxWindow, cyWindow, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam;}void FindWindowSize(int * pcxWindow, int * pcyWindow){ HDC hdcScreen; TEXTMETRIC tm; hdcScreen = CreateIC(TEXT("DISPLAY"), NULL, NULL, NULL); GetTextMetrics(hdcScreen, &tm); DeleteDC(hdcScreen); *pcxWindow = 2 * GetSystemMetrics(SM_CXBORDER) + 12 * tm.tmAveCharWidth; *pcyWindow = 2 * GetSystemMetrics(SM_CYBORDER) + GetSystemMetrics(SM_CYCAPTION) + 2 * tm.tmHeight;}LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ static COLORREF cr, crLast; static HDC hdcScreen; HDC hdc; PAINTSTRUCT ps; POINT pt; RECT rc; TCHAR szBuffer[16]; switch (message) { case WM_CREATE: hdcScreen = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL); SetTimer(hwnd, ID_TIMER, 100, NULL); return 0; case WM_TIMER: GetCursorPos(&pt); cr = GetPixel(hdcScreen, pt.x, pt.y); SetPixel(hdcScreen, pt.x, pt.y, 0); if (cr != crLast) { crLast = cr; InvalidateRect(hwnd, NULL, FALSE); } return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &rc); wsprintf(szBuffer, TEXT(" %02X %02X %02X "), GetRValue(cr), GetGValue(cr), GetBValue(cr)); DrawText(hdc, szBuffer, -1, &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER); EndPaint(hwnd, &ps); return 0; case WM_DESTROY: DeleteDC(hdcScreen); KillTimer(hwnd, ID_TIMER); PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam);}
阅读全文
0 0
- Windows程序设计-定时器
- Windows程序设计(三)---定时器的三种使用方法
- 第四章定时器 windows程序设计王艳平版
- windows定时器
- Windows定时器
- Windows定时器
- windows 程序设计
- Windows程序设计
- Windows程序设计
- Windows 程序设计
- Windows程序设计
- Windows程序设计
- WINDOWS程序设计
- Windows 程序设计
- Windows程序设计
- Windows程序设计
- Windows程序设计
- windows 程序设计
- Linux中jdk的安装
- mysql 数据库整理——数据表数据的增删改查
- github+hexo搭建自己的博客网站(六)进阶配置(搜索引擎收录,优化你的url)
- Android--(5)--详解ImageView属性
- MP4结构分析
- Windows程序设计-定时器
- JVM、Java编译器和Java解释器
- matlab2c使用c++实现matlab函数系列教程-unifstat函数
- ACM随笔
- 使用中遇到的错误(更新中)
- java克隆
- mybatis学习之路----输出映射之resultType resultMap
- 802.11协议帧间间隔-SIFS,DIFS,PIFS,EIFS
- bzoj3175: [Tjoi2013]攻击装置