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

/*----------------------------------------------------------------------------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

/*---------------------------------------------------------------------------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);}

以定时器进行状态报告

GetPixel

/*--------------------------------------------------------------------------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);}
原创粉丝点击