65.9K
CodeProject 正在变化。 阅读更多。
Home

数字模拟时钟

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.68/5 (10投票s)

2002年8月4日

4分钟阅读

viewsIcon

116765

downloadIcon

2019

数字模拟时钟。

Sample Image - LEDChars.gif

Sample Image - MultiClocks.gif

有什么新内容

本文现在是两个项目的一个组合,在新父项目Clocks下,源代码已在很大程度上被修改,以消除通过Document类对类的直接引用,删除了一些旧的源文件并添加了新的源文件,以便使用新的子类CAnalogCDigital

在原始的LEDChars项目中添加了以下新的子类

  • CAnalog (Analog.cpp / Analog.h)
  • CDigital (Digital.cpp / Digital.h)
  • CAnanlogView (AnalogView.cpp / AnalogView.h)
  • CDigitalView (DigitalView.cpp / DigitalView.h)

新添加的项目名为MultipleClocks,它使用子类CAnalog,该子类已在上面的项目(LEDChars)中使用。当你打开Clocks项目时,当前活动的项目将在左侧的项目窗格中以粗体显示(VC6,.NET 不知道)。当你选择菜单中的 Build->Build (??) 或 Build->Rebuild All 时,将构建当前活动的项目。

要使其他项目成为活动项目,请从菜单中选择 Project->Set Active Project,然后选择您想要的 **或** 在左侧的项目窗格中左键单击您想要成为活动项目的项目,然后从弹出菜单中选择 Set Active project。

要同时构建两个项目,请从菜单中选择 Build->Batch Build,然后在显示的窗体上,根据您的要求点击 Build 或 Rebuild All。

要将子类CAnalogCDigital单独或一起用于您自己的某个项目中,请参阅下面的如何操作部分。

引言

本文介绍了如何创建两种不同类型的时钟:一种是数字时钟(时间以字符显示),另一种是模拟时钟(时间像手表一样显示,有小时、分钟和秒针),类似于手表上的时钟。

特点

该时钟以数字和模拟形式显示一些国家(可能不准确)的时间,国家/地区/城市数量已保持在最低限度,以便其他人可以修改该项目,将其转换为显示世界上所有国家的时间,并使其成为世界时钟。

LEDChars 项目

在左侧窗格中显示一个treeview,其中包含一些国家或时区,右侧上方为模拟时钟,下方为数字时钟。

MultipleClocks 项目

显示多个模拟时钟视图。开始时,所有视图都显示格林威治标准时间。要设置这些视图中的任何一个以显示不同时区的时间,请右键单击该视图,然后从显示的弹出菜单中选择要设置的时区。

操作指南

使用子类 CAnalog

  • 将源文件Analog.cppAnalog.h复制或拖放到您的项目文件夹中。

在基于对话框的项目上

  • 添加 Windows 消息处理程序 WM_DESTROY (OnDestroy)
  • 添加 Windows 消息处理程序 WM_TIMER (OnTimer)
  • 添加行 #Include "Analog.h"
  • 创建一个变量 CAnalog m_Analog
  • OnInitDialog() 成员函数中,添加以下行
    int C?????::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
      if (CView::OnCreate(lpCreateStruct) == -1)
        return -1;
    
      m_Analog.Create("", WS_VISIBLE|WS_CHILD, CRect(0,0,450,300), this , 0);
      SetTimer(0, 1000, NULL);
      //Change the values 0, 450 and 300 as per you requirements
      // Add the following line in the OnDestroy function created above
    
      return 0;
    }
    
    void C?????::OnDestroy() 
    {
      CTreeView::OnDestroy();
      // TODO: Add your message handler code here
      // The KillTimer function is very essential without 
      //which you system can crash 
      KillTimer(1);  
    }
    
    //In the OnTimer Function, add the following lines
    
    void C???????::OnTimer(UINT nIDEvent) 
    {
      // TODO: Add your message handler code here and/or call default
      struct tm *oTime;
      time_t t;
      time(&t);
      oTime = gmtime(&t);
      m_Analog.m_Country = "GMT" 
      // the name of the Time-Zone
      m_Analog.SetTime(oTime);
      CTreeView::OnTimer(nIDEvent);
    }
    //
    // Note : To use the sub-class without the Timer function
    // Do not create the Windows message handlers 
    // OnDestroy and OnTimer 
    // Comment the line SetTimer(0, 1000, Null)
    // Before the line m_Analog.Create( .....) type the following
    // m_Analog.m_bStandalone = TRUE;
    //

CView 视图类上,遵循与上面相同的说明,只是 m_Analog.Create(....) 应该在 OnCreate()OnInitialUpdate() 函数中。

使用子类 CDigital

  • 将源文件Digital.cppDigital.h复制或拖放到您的项目文件夹中。
  • CAnalog 子类的程序相同,只是类名不同。

注意m_bStandAlone 目前在此不适用。

工作原理

SetTimer() 函数设置系统计时器,框架每 1/1000th 秒重复调用 OnTimer() 函数来更新时钟,在 CAnanlog 子类中,Invalidate(FALSE) 函数会调用 OnPaint() 函数来绘制时钟,同样,CDigital 时钟也在 OnPaint() 函数中绘制。

在数字时钟中,每个字符都由垂直线和水平线组成。例如,数字1由两条垂直线组成,数字0(零)由七条线组成,上面一条水平线,下面一条水平线,两条左侧垂直线,两条右侧垂直线。同样,数字8由与数字1相同的线条图案组成,并额外有一条中心线,依此类推,根据传递给它的字符,函数 DrawCharacter 绘制字符如下

void CDigital::DrawCharacter(CDC *pDC, CString sChar, int nLeft, 
      int nTop, COLORREF clr)
{

  if(sChar == "A")
  {
    pDC->FillSolidRect(nLeft+5  ,nTop+15,   15  ,5, clr); 
    // Top Line
    pDC->FillSolidRect(nLeft    ,nTop+20,  5  ,30, clr); 
    // Left Top
    pDC->FillSolidRect(nLeft+20 ,nTop+20, 5  ,30, clr ); 
    // Right Top
    pDC->FillSolidRect(nLeft+5  ,nTop+32,   15  ,5, clr );  
    // Central Line
    return;
  }

  if(sChar == "P")
  {
    pDC->FillSolidRect(nLeft+5  ,nTop+15,   15  ,5, clr); 
    // Top Line
    pDC->FillSolidRect(nLeft    ,nTop+20,  5  ,30, clr); 
    // Left Top
    pDC->FillSolidRect(nLeft+20 ,nTop+20, 5  ,12, clr ); 
    // Right Top
    pDC->FillSolidRect(nLeft+5  ,nTop+32,   15  ,5, clr );  
    // Central Line
    return;
  }

  if(sChar == "M")
  {
    pDC->FillSolidRect(nLeft    ,nTop+15,  15 ,5, clr); 
    // Top Line
    pDC->FillSolidRect(nLeft-5  ,nTop+20,  5  ,30, clr); 
    // Left Top
    pDC->FillSolidRect(nLeft+15 ,nTop+20,  5  ,30, clr ); 
    // Right Top
    pDC->FillSolidRect(nLeft+5  ,nTop+15,  5  ,15, clr ); 
    // Small Line
    return;
  }

  if(sChar == ":")
  {
    pDC->FillSolidRect(nLeft+12 , nTop + 12 , 7, 7,clr);
    pDC->FillSolidRect(nLeft+12 , nTop + 40 ,7, 7,clr);
    return;
  }

  if((sChar == "0") ||
     (sChar == "2") ||
     (sChar == "3") ||
     (sChar == "5") ||
     (sChar == "6") ||
     (sChar == "7") ||
     (sChar == "8") ||
     (sChar == "9"))
     pDC->FillSolidRect(nLeft,nTop,25,5, clr); 
     // Top Line

  if((sChar == "0") ||
       (sChar == "4") ||
     (sChar == "5") ||
     (sChar == "6") ||
     (sChar == "8") ||
     (sChar == "9"))
     pDC->FillSolidRect(nLeft-5,nTop+5,5,20, clr); 
     // Left Top

  if((sChar == "0") ||
     (sChar == "1") ||
     (sChar == "2") ||
     (sChar == "3") ||
     (sChar == "4") ||
     (sChar == "7") ||
     (sChar == "8") ||
     (sChar == "9"))
     pDC->FillSolidRect(nLeft+25,nTop+5,5,20, clr ); 
     // Right Top
  
  if((sChar == "2") ||
     (sChar == "3") ||
     (sChar == "4") ||
     (sChar == "5") ||
     (sChar == "6") ||
     (sChar == "8") ||
     (sChar == "9"))
     pDC->FillSolidRect(nLeft,nTop+25,25,5, clr );  
     // Central Line
  
  if((sChar == "0") ||
     (sChar == "2") ||
     (sChar == "3") ||
     (sChar == "5") ||
     (sChar == "6") ||
     (sChar == "8") ||
     (sChar == "9"))
     pDC->FillSolidRect(nLeft,nTop+50,25,5, clr );  
     // Bottom Line

  if((sChar == "0") ||
     (sChar == "2") ||
     (sChar == "6") ||
     (sChar == "8"))
     pDC->FillSolidRect(nLeft-5,nTop+30,5,20, clr ); 
     // Bottom Left

  if((sChar == "0") ||
     (sChar == "1") ||
     (sChar == "3") ||
     (sChar == "4") ||
     (sChar == "5") ||
     (sChar == "6") ||
     (sChar == "7") ||
     (sChar == "8") ||
     (sChar == "9"))
     pDC->FillSolidRect(nLeft+25,nTop+30,5,20, clr); 
     // Bottom Right
}

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.