7.3  定时器应用示例

7.3 定时器应用示例

  • 最近更新2018年10月12日

特殊说明:版权归个人所有,请勿转载,谢谢合作。

7.3          定时器应用示例

【例7-1】程序启动后显示当前的系统时间。定时器的示例代码如下:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  PAINTSTRUCT ps;					// 结构体包含了用于绘制
                                                        // 窗口客户区的信息
  HDC  hdc;						// 设备环境句柄
  int i = 0;
    // 消息处理
    //
  switch (message) 
  {
    // 图形绘制事件
  case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);
    {
      SYSTEMTIME sys;
      char szTime[64] = { 0 };
      
      GetLocalTime(&sys);
      sprintf(szTime, "%4d年%02d月%02d日 %02d:%02d:%02d", 
        sys.wYear,sys.wMonth,sys.wDay, sys.wHour,
        sys.wMinute, sys.wSecond);
      
      RECT rtPos;
      GetClientRect(hWnd, &rtPos);			
      DrawText(hdc, szTime, strlen(szTime), &rtPos, DT_CENTER);
    }
    EndPaint(hWnd, &ps);
    break;
  
    // 定时器处理消息
  case WM_TIMER:
    // 只处理我们自己的消息
    if(wParam == 999)
    {
      RECT winRt;
      GetClientRect(hWnd, &winRt);
      InvalidateRect(hWnd, &winRt, TRUE);
    }//end if
    break;
    
    // 窗口创建消息
  case WM_CREATE:
    // 设置定时器
    SetTimer(hWnd, 999, 1000, NULL);
    break;
    
    // 窗口关闭消息
  case WM_CLOSE:
    // 删除定时器
    KillTimer(hWnd, 999);
    DestroyWindow(hWnd);
    break;
    
    // 窗口销毁消息,关闭窗口时响应。
  case WM_DESTROY:
    PostQuitMessage(0);
    break;
  default:
    // 调用系统默认消息处理,即交给系统处理。
    return DefWindowProc(hWnd, message, wParam, lParam);
  }//end switch
  return 0;
}

 

程序执行结果如图7.1所示。

 

  • 图7.1 定时器执行结果

 

首先,捕获WM_CREATE消息,主要目的是在窗口的创建之初,使用SetTimer函数设置定时器,并且每隔一秒钟响应一定WM_TIMER消息。消息ID为999。

  // 窗口创建消息
case WM_CREATE:
  // 设置定时器
  SetTimer(hWnd, 999, 1000, NULL);
  break;

 

其次,捕获WM_TIMER消息,每隔一秒钟响应一次此消息,通过wParam参数来判断消息是否属于的刚刚创建的消息(ID为999),如果是,则获得系统客户区尺寸,并对该客户区进行刷新操作。目的是响应WM_PAINT消息。

  // 定时器处理消息
case WM_TIMER:
  // 只处理我们自己的消息
  if(wParam == 999)
  {
    RECT winRt;
    GetClientRect(hWnd, &winRt);
    InvalidateRect(hWnd, &winRt, TRUE);
  }//end if
  break;

 

再次,捕获WM_PAINT消息,通过GetLocalTime函数来获得系统时间,并将时间格式化到字符串中,最终以DrawText的方式,将文本绘制到屏幕上。

  // 图形绘制事件
case WM_PAINT:
  hdc = BeginPaint(hWnd, &ps);

  {
    SYSTEMTIME sys;
    char szTime[64] = { 0 };
    
    GetLocalTime(&sys);
    sprintf(szTime, "%4d年%02d月%02d日 %02d:%02d:%02d", 
      sys.wYear,sys.wMonth,sys.wDay, sys.wHour,
      sys.wMinute, sys.wSecond);
    
    RECT rtPos;
    GetClientRect(hWnd, &rtPos);			
    DrawText(hdc, szTime, strlen(szTime), &rtPos, DT_CENTER);
  }

  EndPaint(hWnd, &ps);
  break;

 

最后,捕获WM_CLOSE消息,通过KillTimer函数将ID为999的定时器进行销毁,并使用DestroyWindow函数将应用程序窗口销毁。

  // 窗口关闭消息
case WM_CLOSE:
  // 删除定时器
  KillTimer(hWnd, 999);
  DestroyWindow(hWnd);
  break;

 

分享到 :
相关推荐

发表回复

登录... 后才能评论