模拟时钟程序设计全解
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
void CClock2Dlg::Onexitbt()
{
// TODO: Add your control notification handler code here
CDialog::OnCancel();
KillTimer(1);
}
7.33实现系统时间与自定义时间同步的函数
void CClock2Dlg::OnTimer(UINT nIDEvent)
int nowtime=t.GetHour()*3600+t.GetMinute()*60+t.GetSecond()-ssecond;
int a=nowtime%(24*3600)/3600;
int b=nowtime%(24*3600)%3600/60;
int c=nowtime%(24*3600)%3600%60;
ptDiamond[1].Offset((int)(nRadus * sin(fRadian)), (int)(- nRadus * cos(fRadian)));
fRadian += 0.5 * PI;
nRadus = m_nRadius / 10;
ptDiamond[2].Offset((int)(nRadus * sin(fRadian)), (int)(- nRadus * cos(fRadian)));
1.
2.
3.
4.
5.
6.
7.
1.
1.1
1学习Visual C++的MFC开发程序的步骤。
2综合运用所学的类、继承和多态的知识。
3进一步掌握程序的调试方法。
1.2
1基于MFC的WINDOWS应用程序设计方法,编写一个模拟时钟程序;
2在屏幕中间有一个指针式时钟;
3这个时钟的下方或者上方以数字方式显示时间,该时间应与指针显示的时间一致;
}
int nRadus = m_nRadius / 2;
ptDiamond[0].Offset((int)(nRadus * sin(fRadian)), (int)(- nRadus * cos(fRadian)));
fRadian += 0.5 * PI;
nRadus = m_nRadius / 20;
4.3
用CTime::GetCurrentTime()调用系统的时间;定义一个CTime的对象t,用t.GetHour(),t.GetMinute(),t.GetSecond()抽出时间的时分秒,并同意化成距0:00:00时刻的秒数;用该秒数减去自定义时间的秒数然后化成十分秒的形式,分别在指针时钟和数字时钟的静态文本上输出,并用SetTime()函数每一秒输出一次(即重绘)。便可实现显示时间功能。
//绘制菱形时针
pDC->Polygon(ptDiamond, 4);
//恢复设备环境
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}//时针
CClockMinHand::CClockMinHand()
{
//定义默认颜色
m_crMain = RGB(0, 255, 100);
int nowtime=t.GetHour()*3600+t.GetMinute()*60+t.GetSecond()-ssecond;
j=nowtime%(24*3600)/3600;
k=nowtime%(24*3600)%3600/60;
l=nowtime%(24*3600)%3600%60;
CStatic::OnTimer(nIDEvent);
}
CClockHourHand::~CClockHourHand()
{
}
void CClockHourHand::Draw(CDC *pDC)
{
//初始化设备环境
CPen penMain(PS_SOLID, 1, m_crMain), penOther(PS_SOLID, 1, m_crOther);
以上便是本次实验的设计思路。
4.
4.1
1.决定用基本对话框来完成本次实验并设计好实验的对话框样式,添加所需的按钮、编辑框等控件。
2.数字时钟难度不大,而指针时钟比较困难,上网查阅指针时钟的制作的教程,并寻找所需的函数。定义好需要的类和成员函数。
3.设计算法并成员函数。
4.2
根据课设题目的要求,我决定设计两个个静态文本分别输出指针时钟的图像和数字时钟的数字显示;设置三个编辑框输入自定义的时分秒;设置两个按钮接收设置的时间和退出程序。
4用菜单选项打开的对话框,或者主界面里的控件设置时间。时间不必与机器系统时间相同,可任意设置。
2.
编辑运行代码时,窗口界面会出现一个色调为绿色,背景为黑色的指针时钟;一个精确到秒的数字时钟;一个退出按钮;一个设置按钮;三个设置自定义时间的编辑框。运行时调用的为系统的时间,在编辑框中分别输入自定义时分秒点击设置,指针时钟和数字时钟会跳转为自定义时间。按退出键关闭窗口。
CBrush brMain(m_crMain), brOther(m_crOther);
CPen *pOldPen = pDC->SelectObject(&penOther);
CBrush *pOldBrush = pDC->SelectObject(&brMain);
//确定当前指针的弧度
//int nTime = (m_tmCur.GetHour() % 12) * 3600;
5.
完成本次课程设计是我大学生涯做过最困难的事情,没有之一。由于过度自信和选择的随意,在没有了解MFC之前变随意选择了一个题目。动手起来处处是难点,每完成一个部分都要花费大量时间,效率十分低。于是花费一天时间查阅文字资料,终于会MFC程序设计有了一定的了解,着手起来顺利许多。元旦前一天整个下午都在机房向老师请教问题,感觉之前从网上生搬硬套的东西也通透了很多。最后在跨年钟声敲响前一刻完成了试验,感觉整个人一下轻松下来,细想收获颇丰。
}指针时钟的OnTimer函数
以上关键源代码主要为算法,全为本人设计,无参考文献。
7.34指针时钟时针分秒针的绘制
CClockHourHand::CClockHourHand()
{
//定义默认颜色
m_crMain = RGB(0, 255, 100);
m_crOther = RGB(128, 128, 0);
m_crOther = RGB(128, 128, 0);
}
CClockMinHand::~CClockMinHand()
{ห้องสมุดไป่ตู้
}
void CClockMinHand::Draw(CDC *pDC)
{
//初始化设备环境
CPen penMain(PS_SOLID, 1, m_crMain), penOther(PS_SOLID, 1, m_crOther);
int nTime = (j % 12) * 3600;
nTime += k* 60;
nTime += l;
double fRadian = 2 * PI * nTime / 3600 / 12;
//确定绘制菱形指针所需的四个角的坐标
CPoint ptDiamond[4];
for(int i=0; i<4; i++)
{
ptDiamond[i] = m_rcRegion.CenterPoint();
}
int nRadus = m_nRadius / 2;
ptDiamond[0].Offset((int)(nRadus * sin(fRadian)), (int)(- nRadus * cos(fRadian)));
ptDiamond[2].Offset((int)(nRadus * sin(fRadian)), (int)(- nRadus * cos(fRadian)));
fRadian += 0.5 * PI;
nRadus = m_nRadius / 20;
ptDiamond[3].Offset((int)(nRadus * sin(fRadian)), (int)(- nRadus * cos(fRadian)));
而在程序初步完成后,导师初查指出用SetTime()计数与系统时间的进度存在误差,所以不可以用SetTime()函数计时。于是本人将算法改成用系统时间和编辑框输入的时间
作差,得到一个定值,再用系统时间减去这个定值就为设置的时间了,此时SetTime()函
数仅仅起到一个重绘作用,时间进度是有系统时间进度决定的。
}//数字时钟的OnTimer函数
void CClockEx::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
Invalidate(FALSE);
CTime t=CTime::GetCurrentTime();
str.Format("%02d: %02d: %02d",a,b,c);
SetDlgItemText(IDC_curtime,str);
//m_s1.Format("%02d",a);
//m_s2.Format("%02d",b);
//m_s3.Format("%02d",c);
CDialog::OnTimer(nIDEvent);
CBrush brMain(m_crMain), brOther(m_crOther);
CPen *pOldPen = pDC->SelectObject(&penOther);
CBrush *pOldBrush = pDC->SelectObject(&brMain);
//确定分针所在位置的弧度
int nTime = k * 60;
6.
百度文库“指针时钟制作教程”
7.
7.1
调试成功,无错误报告
7.2
测试结果如图所示
系统时间
自定义时间1
自定义时间2
7.3
7.31设置按钮和编辑框的关联
void CClock2Dlg::OnButton1()
{
// TODO: Add your control notification handler code here
UpdateData();
CTime t=CTime::GetCurrentTime();
ssecond=(t.GetHour()-atoi(m_s1))*3600+(t.GetMinute()-atoi(m_s2))*60+t.GetSecond()-atoi(m_s3);
}
7.32退出按钮的实现
fRadian += 0.5 * PI;
nRadus = m_nRadius / 20;
ptDiamond[1].Offset((int)(nRadus * sin(fRadian)), (int)(- nRadus * cos(fRadian)));
fRadian += 0.5 * PI;
nRadus = m_nRadius / 10;
fRadian += 0.5 * PI;
nRadus = m_nRadius / 20;
ptDiamond[3].Offset((int)(nRadus * sin(fRadian)), (int)(- nRadus * cos(fRadian)));
//绘制菱形分针
pDC->Polygon(ptDiamond, 4);
nTime += l;
double fRadian = 2 * PI * nTime / 3600;
//确定绘制菱形指针所需的四个角的坐标
CPoint ptDiamond[4];
for(int i=0; i<4; i++)
{
ptDiamond[i] = m_rcRegion.CenterPoint();
{
// TODO: Add your message handler code here and/or call default
CTime t=CTime::GetCurrentTime();
CString str;
str.Format("%02d: %02d: %02d",t.GetHour(),t.GetMinute(),t.GetSecond());
3.
首先,指针时钟的背景,指针形状长度,正点格子和秒数格子的设计代码过于繁琐和复杂,稍做了解便可从网上抄录,然后再把参数及变量改成自己设计部分所需的名称即可。
其次,本程序的基础及核心思路为用一个计数器器SetTime(1,1000,NULL)调用WM_TIMER的On Timer()函数,达到更新时间,重绘窗口的效果。
void CClock2Dlg::Onexitbt()
{
// TODO: Add your control notification handler code here
CDialog::OnCancel();
KillTimer(1);
}
7.33实现系统时间与自定义时间同步的函数
void CClock2Dlg::OnTimer(UINT nIDEvent)
int nowtime=t.GetHour()*3600+t.GetMinute()*60+t.GetSecond()-ssecond;
int a=nowtime%(24*3600)/3600;
int b=nowtime%(24*3600)%3600/60;
int c=nowtime%(24*3600)%3600%60;
ptDiamond[1].Offset((int)(nRadus * sin(fRadian)), (int)(- nRadus * cos(fRadian)));
fRadian += 0.5 * PI;
nRadus = m_nRadius / 10;
ptDiamond[2].Offset((int)(nRadus * sin(fRadian)), (int)(- nRadus * cos(fRadian)));
1.
2.
3.
4.
5.
6.
7.
1.
1.1
1学习Visual C++的MFC开发程序的步骤。
2综合运用所学的类、继承和多态的知识。
3进一步掌握程序的调试方法。
1.2
1基于MFC的WINDOWS应用程序设计方法,编写一个模拟时钟程序;
2在屏幕中间有一个指针式时钟;
3这个时钟的下方或者上方以数字方式显示时间,该时间应与指针显示的时间一致;
}
int nRadus = m_nRadius / 2;
ptDiamond[0].Offset((int)(nRadus * sin(fRadian)), (int)(- nRadus * cos(fRadian)));
fRadian += 0.5 * PI;
nRadus = m_nRadius / 20;
4.3
用CTime::GetCurrentTime()调用系统的时间;定义一个CTime的对象t,用t.GetHour(),t.GetMinute(),t.GetSecond()抽出时间的时分秒,并同意化成距0:00:00时刻的秒数;用该秒数减去自定义时间的秒数然后化成十分秒的形式,分别在指针时钟和数字时钟的静态文本上输出,并用SetTime()函数每一秒输出一次(即重绘)。便可实现显示时间功能。
//绘制菱形时针
pDC->Polygon(ptDiamond, 4);
//恢复设备环境
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}//时针
CClockMinHand::CClockMinHand()
{
//定义默认颜色
m_crMain = RGB(0, 255, 100);
int nowtime=t.GetHour()*3600+t.GetMinute()*60+t.GetSecond()-ssecond;
j=nowtime%(24*3600)/3600;
k=nowtime%(24*3600)%3600/60;
l=nowtime%(24*3600)%3600%60;
CStatic::OnTimer(nIDEvent);
}
CClockHourHand::~CClockHourHand()
{
}
void CClockHourHand::Draw(CDC *pDC)
{
//初始化设备环境
CPen penMain(PS_SOLID, 1, m_crMain), penOther(PS_SOLID, 1, m_crOther);
以上便是本次实验的设计思路。
4.
4.1
1.决定用基本对话框来完成本次实验并设计好实验的对话框样式,添加所需的按钮、编辑框等控件。
2.数字时钟难度不大,而指针时钟比较困难,上网查阅指针时钟的制作的教程,并寻找所需的函数。定义好需要的类和成员函数。
3.设计算法并成员函数。
4.2
根据课设题目的要求,我决定设计两个个静态文本分别输出指针时钟的图像和数字时钟的数字显示;设置三个编辑框输入自定义的时分秒;设置两个按钮接收设置的时间和退出程序。
4用菜单选项打开的对话框,或者主界面里的控件设置时间。时间不必与机器系统时间相同,可任意设置。
2.
编辑运行代码时,窗口界面会出现一个色调为绿色,背景为黑色的指针时钟;一个精确到秒的数字时钟;一个退出按钮;一个设置按钮;三个设置自定义时间的编辑框。运行时调用的为系统的时间,在编辑框中分别输入自定义时分秒点击设置,指针时钟和数字时钟会跳转为自定义时间。按退出键关闭窗口。
CBrush brMain(m_crMain), brOther(m_crOther);
CPen *pOldPen = pDC->SelectObject(&penOther);
CBrush *pOldBrush = pDC->SelectObject(&brMain);
//确定当前指针的弧度
//int nTime = (m_tmCur.GetHour() % 12) * 3600;
5.
完成本次课程设计是我大学生涯做过最困难的事情,没有之一。由于过度自信和选择的随意,在没有了解MFC之前变随意选择了一个题目。动手起来处处是难点,每完成一个部分都要花费大量时间,效率十分低。于是花费一天时间查阅文字资料,终于会MFC程序设计有了一定的了解,着手起来顺利许多。元旦前一天整个下午都在机房向老师请教问题,感觉之前从网上生搬硬套的东西也通透了很多。最后在跨年钟声敲响前一刻完成了试验,感觉整个人一下轻松下来,细想收获颇丰。
}指针时钟的OnTimer函数
以上关键源代码主要为算法,全为本人设计,无参考文献。
7.34指针时钟时针分秒针的绘制
CClockHourHand::CClockHourHand()
{
//定义默认颜色
m_crMain = RGB(0, 255, 100);
m_crOther = RGB(128, 128, 0);
m_crOther = RGB(128, 128, 0);
}
CClockMinHand::~CClockMinHand()
{ห้องสมุดไป่ตู้
}
void CClockMinHand::Draw(CDC *pDC)
{
//初始化设备环境
CPen penMain(PS_SOLID, 1, m_crMain), penOther(PS_SOLID, 1, m_crOther);
int nTime = (j % 12) * 3600;
nTime += k* 60;
nTime += l;
double fRadian = 2 * PI * nTime / 3600 / 12;
//确定绘制菱形指针所需的四个角的坐标
CPoint ptDiamond[4];
for(int i=0; i<4; i++)
{
ptDiamond[i] = m_rcRegion.CenterPoint();
}
int nRadus = m_nRadius / 2;
ptDiamond[0].Offset((int)(nRadus * sin(fRadian)), (int)(- nRadus * cos(fRadian)));
ptDiamond[2].Offset((int)(nRadus * sin(fRadian)), (int)(- nRadus * cos(fRadian)));
fRadian += 0.5 * PI;
nRadus = m_nRadius / 20;
ptDiamond[3].Offset((int)(nRadus * sin(fRadian)), (int)(- nRadus * cos(fRadian)));
而在程序初步完成后,导师初查指出用SetTime()计数与系统时间的进度存在误差,所以不可以用SetTime()函数计时。于是本人将算法改成用系统时间和编辑框输入的时间
作差,得到一个定值,再用系统时间减去这个定值就为设置的时间了,此时SetTime()函
数仅仅起到一个重绘作用,时间进度是有系统时间进度决定的。
}//数字时钟的OnTimer函数
void CClockEx::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
Invalidate(FALSE);
CTime t=CTime::GetCurrentTime();
str.Format("%02d: %02d: %02d",a,b,c);
SetDlgItemText(IDC_curtime,str);
//m_s1.Format("%02d",a);
//m_s2.Format("%02d",b);
//m_s3.Format("%02d",c);
CDialog::OnTimer(nIDEvent);
CBrush brMain(m_crMain), brOther(m_crOther);
CPen *pOldPen = pDC->SelectObject(&penOther);
CBrush *pOldBrush = pDC->SelectObject(&brMain);
//确定分针所在位置的弧度
int nTime = k * 60;
6.
百度文库“指针时钟制作教程”
7.
7.1
调试成功,无错误报告
7.2
测试结果如图所示
系统时间
自定义时间1
自定义时间2
7.3
7.31设置按钮和编辑框的关联
void CClock2Dlg::OnButton1()
{
// TODO: Add your control notification handler code here
UpdateData();
CTime t=CTime::GetCurrentTime();
ssecond=(t.GetHour()-atoi(m_s1))*3600+(t.GetMinute()-atoi(m_s2))*60+t.GetSecond()-atoi(m_s3);
}
7.32退出按钮的实现
fRadian += 0.5 * PI;
nRadus = m_nRadius / 20;
ptDiamond[1].Offset((int)(nRadus * sin(fRadian)), (int)(- nRadus * cos(fRadian)));
fRadian += 0.5 * PI;
nRadus = m_nRadius / 10;
fRadian += 0.5 * PI;
nRadus = m_nRadius / 20;
ptDiamond[3].Offset((int)(nRadus * sin(fRadian)), (int)(- nRadus * cos(fRadian)));
//绘制菱形分针
pDC->Polygon(ptDiamond, 4);
nTime += l;
double fRadian = 2 * PI * nTime / 3600;
//确定绘制菱形指针所需的四个角的坐标
CPoint ptDiamond[4];
for(int i=0; i<4; i++)
{
ptDiamond[i] = m_rcRegion.CenterPoint();
{
// TODO: Add your message handler code here and/or call default
CTime t=CTime::GetCurrentTime();
CString str;
str.Format("%02d: %02d: %02d",t.GetHour(),t.GetMinute(),t.GetSecond());
3.
首先,指针时钟的背景,指针形状长度,正点格子和秒数格子的设计代码过于繁琐和复杂,稍做了解便可从网上抄录,然后再把参数及变量改成自己设计部分所需的名称即可。
其次,本程序的基础及核心思路为用一个计数器器SetTime(1,1000,NULL)调用WM_TIMER的On Timer()函数,达到更新时间,重绘窗口的效果。