数字模拟时钟






3.68/5 (10投票s)
2002年8月4日
4分钟阅读

116765

2019
数字模拟时钟。
有什么新内容
本文现在是两个项目的一个组合,在新父项目Clocks
下,源代码已在很大程度上被修改,以消除通过Document
类对类的直接引用,删除了一些旧的源文件并添加了新的源文件,以便使用新的子类CAnalog
和CDigital
。
在原始的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。
要将子类CAnalog
和CDigital
单独或一起用于您自己的某个项目中,请参阅下面的如何操作部分。
引言
本文介绍了如何创建两种不同类型的时钟:一种是数字时钟(时间以字符显示),另一种是模拟时钟(时间像手表一样显示,有小时、分钟和秒针),类似于手表上的时钟。
特点
该时钟以数字和模拟形式显示一些国家(可能不准确)的时间,国家/地区/城市数量已保持在最低限度,以便其他人可以修改该项目,将其转换为显示世界上所有国家的时间,并使其成为世界时钟。
LEDChars 项目
在左侧窗格中显示一个treeview
,其中包含一些国家或时区,右侧上方为模拟时钟,下方为数字时钟。
MultipleClocks 项目
显示多个模拟时钟视图。开始时,所有视图都显示格林威治标准时间。要设置这些视图中的任何一个以显示不同时区的时间,请右键单击该视图,然后从显示的弹出菜单中选择要设置的时区。
操作指南
使用子类 CAnalog
- 将源文件Analog.cpp和Analog.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.cpp和Digital.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
}
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。