⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 8. 定时器.txt

📁 本书介绍了在Microsoft Windows 98、Microsoft Windows NT 4.0和Windows NT 5.0下程序写作的方法
💻 TXT
📖 第 1 页 / 共 4 页
字号:
                  MessageBox (  NULL, TEXT ("Program requires Windows NT!"),
        
                                                                        szAppName, MB_ICONERROR) ;
        
                  return 0 ;
        
           }
        
   
        
           hwnd = CreateWindow ( szAppName, "Beeper2 Timer Demo",
        
                                                         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 ;
        
}
        

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
        
{
        
   switch (message)
        
    {
        
           case   WM_CREATE:
        
                  SetTimer (hwnd, ID_TIMER, 1000, TimerProc) ;
        
                 return 0 ;
        
       
        
           case   WM_DESTROY:
        
                  KillTimer (hwnd, ID_TIMER) ;
        
                  PostQuitMessage (0) ;
        
                  return 0 ;
        
           }
        
           return DefWindowProc (hwnd, message, wParam, lParam) ;
        
}
        

VOID CALLBACK TimerProc (HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)
        
{
        
           static BOOL fFlipFlop = FALSE ;
        
           HBRUSH                        hBrush ;
        
           HDC                                  hdc ;
        
           RECT                                 rc ;
        
          
        
           MessageBeep (-1) ;
        
           fFlipFlop = !fFlipFlop ;
        
   
        
           GetClientRect (hwnd, &rc) ;
        
          hdc = GetDC (hwnd) ;
        
    hBrush = CreateSolidBrush (fFlipFlop ? RGB(255,0,0) : RGB(0,0,255)) ;
        
   
        
    FillRect (hdc, &rc, hBrush) ;
        
   ReleaseDC (hwnd, hdc) ;
        
   DeleteObject (hBrush) ;
        
}
        
方法三


设定定时器的第三种方法类似于第二种方法,只是传递给SetTimer的hwnd参数被设定为NULL,并且第二个参数(通常为定时器ID)被忽略了,最后,此函数传回定时器ID:

iTimerID = SetTimer (NULL, 0, wMsecInterval, TimerProc) ;
        
如果没有可用的定时器,那么从SetTimer传回的iTimerID值将为NULL。

KillTimer的第一个参数(通常是窗口句柄)也必须为NULL,定时器ID必须是SetTimer的传回值:

KillTimer (NULL, iTimerID) ;
        
传递给TimerProc定时器函数的hwnd参数也必须是NULL。这种设定定时器的方法很少被使用。如果在您的程序在不同时刻有一系列的SetTimer呼叫,而又不希望追踪您已经用过了那些定时器ID,那么使用此方法是很方便的。

既然您已经知道了如何使用Windows定时器,就可以开始讨论一些有用的定时器程序了。

定时器用于时钟


时钟是定时器最明显的应用,因此让我们来看看两个时钟,一个数字时钟,一个模拟时钟。

建立数字时钟


程序8-3所示的DIGCLOCK程序,使用类似LED的7个显示方块显示了目前的时间。

程序8-3  DIGCLOCK
        
DIGCLOCK.C
        
/*----------------------------------------------------------------------------
        
  DIGCLOCK.C --         Digital Clock
        
                                          (c) Charles Petzold, 1998
        
----------------------------------------------------------------------------*/
        
#include <windows.h>
        
#define ID_TIMER    1
        
LRESULT 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) ;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -