桌面时钟设计与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
桌面时钟设计与实现
成员:李睿江秀伟许艺韬
专业班级:通信11401
实践日期: 2014年月6日-2014年1月17日
一、综合训练目的与要求
本次面向对象编程实践是学习了C++面向对象程序设计之后进行的必要的实践性环节。
由于各种原因,信息管理与信息系统专业是在学习了一年之后才安排了这个实习,因为就在考试周,任务有点繁重。
本课综合训练的目的和任务:
1. 重温和加深对 C++面向对象编程语言的基本知识的理解和掌握;
2. 掌握 C++语言编程和程序调试的基本技能;
3. 利用网络资源,自己学习MFC或者Qt等相关软件对页面进行布局;
4. 学会与他人协作进行小软件的设计,遇到分歧时,能够处理得当,共同完成实践要求。
二、综合训练任务
(1)需求分析
随着计算机的普及,人们对计算机的要求远不是当初的进行大型数据运算和复杂数据分析了,人与人之间的日常交流,交易等等也都通过计算机来完成了。
因为是“日常用品”,当然想让它看起来舒服一些了,因此,人们对电脑桌面美观实用的需求也达到了一定的程度,现在的生活节奏也快了,都希望在最短的时间内完成最多的事,获取最大的信息量。
人们为了在用计算机工作的同时,随时了解时间,不错过自己的行程安排。
都会在电脑桌面安装一个显示时间日历的小工具,所以桌面时钟的需求还是挺大的。
(2)任务
●桌面时钟是日常小工具,所以良好的人机界面应该做到
●采用面向对象思想设计实现各种类
●因为涉及界面,所以要运用界面设计,我们选择采用QT做界面设计
●能够通过自学习运用自带函数来实现功能
●在实习期间,完成自己负责部分代码的编写和调试,并完成规范的实习论文
三、总体设计
(1)主要模块划分
图 1 主要模块
(2)模块说明
圆盘时钟:指的是圆盘时钟,也就是说,有时针分针秒针显示的时钟,这一模块中,需要绘制各个时针。
电子时钟:我们把它定义为向电子表那样显示的时钟部分,每秒更新一次,并显示出来。
日历:日历就是显示当前日历,并能查询前后的日历。
整体布局:整体布局时,分为水平布局和垂直布局,水平布局用来布局圆盘时钟和电子时钟并行排列,组合之后,和日历的布局用垂直布局完成。
圆盘时钟和电子时钟的单布局也是用垂直布局完成的。
四、详细设计说明
(1)类图
(2)设计说明
圆盘时钟:指的是圆盘时钟,也就是说,有时针分针秒针显示的时钟,这一模块中,需要绘制各个时针,有我的同伴完成,具体实现过程我也限于了解,是先把默认原点坐标移动到中心处,然后分别画刷填充等,定义好指针的形状颜色后,分别画出时针分针秒针,读取当前时间,将各指针每段时间应该旋转的角度计算并设定好,就构成了圆盘时钟了。
电子时钟:我们把它定义为向电子表那样显示的时钟部分,每秒更新一次,并显示出来。
默认状态下,显示的数字位数(包括他们之间的冒号)为5为,这时候,显示的只有小时和分钟。
所以要先将它改为8位的格式,让它把小时、分钟、秒钟都显示出来。
日历:日历就是显示当前日历,并能查询前后的日历。
首先要为日历创建一个表格布局,并将其设置成布局尺寸不变,就是说,日历的布局不会随着窗口的拉大而改变大小。
用setGridVisible(true)将表格线设置为显示,这样就能在日历版面看到网格线,比较适合大家的审美习惯。
把日历表添加到表格布局中,这就算初步完成了日历表格的显示了。
当然了,总体模块除了以上三个主要部分,还有对整体的布局也是不可或缺的。
因此,还有一个重要的模块便是整体布局,整体布局时,分为水平布局和垂直布局,水平布局用来布局圆盘时钟和电子时钟并行排列,组合之后,和日历的布局用垂直布局完成。
圆盘时钟和电子时钟的单布局也是用垂直布局完成的。
(3)具体类说明
/*因为前面已经提到过同伴负责的部分,在这一块就不做说明*/
①calender类
Calender类用来实现日历的显示,继承了QT里的基类QWidget,定义了一个public成员变量calender(),用来声明日历的构造函数。
Private成员变量createPreviewGroupBox()
声明日历框中的函数。
设计的两个函数:
1.calender(),设计日历类,实现创建日历表格、创建表格布局对象,还有一些基本设置。
2.createPreviewGroupBox(),设计日历表格框里的布局,将日历导入表格布局中,再将表格布局添加到窗口部件“日历查询”分组框中。
②mainclock类
Mainclock类用来实现总体布局,将圆盘时钟、电子时钟、日历有机结合起来,使得人机界面友好美观。
在继承基类情况下,定义了一个public成员变量mainclock.在源文件中进行详细设计说明。
首先是窗口类,设计窗口的标题,用库函数中的Qdate获取当前时间,以便程序进行。
然后,创建圆盘时钟对象,对圆盘时钟在总布局中的位置怎么显示进行具体设置,并设置分组框标题。
其次,设置当前日期(年月日),创建电子时钟对象,电子时钟和当前日期设为垂直布局,他们组合后,与圆盘时钟的布局为水平布局。
最后,创建日历对象,将日历添加到布局当中。
详细设计见代码。
这就算完成了总体布局了。
③main类
主类,用来将所有的类组合起来,为总程序服务,控制整个桌面时钟的运行。
#include <windows.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define pi 3.1415926
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, intnCmdShow)
{
MSG Message;
WNDCLASS WndClass;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,"END");
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=WndProc;
WndClass.lpszClassName="WinFill";
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW|CS_VREDRAW;
RegisterClass(&WndClass);
HWND hWnd;
hWnd=CreateWindow("WinFill", //生成窗口
"时钟",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hWnd,nCmdShow); //显示窗口
UpdateWindow(hWnd);
while(GetMessage(&Message,0,0,0)) //消息循环
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
returnMessage.wParam;
}
int m=1,n=60;
intp,q=12;
//VOID WINAPI GetLocalTime(LPSYSTEMTIME lpSystemTime); //获取当前系统时间函LRESULT CALLBACK WndProc(HWND hwnd,UINTmessage,WPARAMwParam,LPARAMlParam) {
HDC hdc;
PAINTSTRUCT ps;
SYSTEMTIME lpSystemTime;
HPEN hpen,HourPen,MinutePen,SecondPen;
switch(message)
{
case WM_PAINT:
GetLocalTime(&lpSystemTime);
hdc=BeginPaint(hwnd,&ps);
hpen=CreatePen(PS_SOLID,4,RGB(0,255,255));
SelectObject(hdc,hpen);
Ellipse(hdc,200,200,400,400);
Ellipse(hdc,295,295,305,305);
doubleRad,RadS;
//RadS=2*pi*m/n;
hpen=CreatePen(PS_SOLID,3,RGB(255,0,0));
SelectObject(hdc,hpen);
for(p=0;p<=q;p++)
{
Rad=2*pi*p/q;
MoveToEx(hdc,(int)(300+100*sin(Rad)),(int)(300-100*cos(Rad)),NULL);
LineTo(hdc,(int)(300+80*sin(Rad)),(int)(300-80*cos(Rad)));
}
m=(double)lpSystemTime.wSecond;
RadS=2*pi*m/n;
SecondPen=CreatePen(PS_SOLID,2,RGB(0,255,0));
SelectObject(hdc,SecondPen);
MoveToEx(hdc,300,300,NULL);
LineTo(hdc,(int)(300+80*sin(RadS)),(int)(300-80*cos(RadS)));
m=(double)(lpSystemTime.wMinute*60.0+lpSystemTime.wSecond);
RadS=2*pi*m/n;
MinutePen=CreatePen(PS_SOLID,3,RGB(0,255,255));
SelectObject(hdc,MinutePen);
MoveToEx(hdc,300,300,NULL);
LineTo(hdc,(int)(300+60*sin(RadS/60.0)),(int)(300-60*cos(RadS/60.0)));
m=(double)(lpSystemTime.wHour*3600.0+lpSystemTime.wMinute*60.0+lpSystemTime.wSecond );
RadS=2*pi*m/n;
HourPen=CreatePen(PS_SOLID,4,RGB(255,255,0));
SelectObject(hdc,HourPen);
MoveToEx(hdc,300,300,NULL);
LineTo(hdc,(int)(300+40*sin(5*RadS/3600.0)),(int)(300-40*cos(5*RadS/3600.0)));
if(1)
{
Sleep(1000);
InvalidateRect(hwnd,NULL,1);
m++;
}
EndPaint(hwnd,&ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
return 0;
}
4设计结果与分析
1) 通过这次课程设计,加强了我们动手、思考和解决问题的能力。
而且在设计
过程中,经常会遇到这样那样的情况,就是心里想老着这样的接法可以行得通,经过老师一点拨就放弃了这种想法。
2) 我沉得做课程设计同时也是对课本知识的巩固和加强,由于课本上的知识太
多,平时课间的学习并不能很好的理解和运用各个函数的功能,而且考试内容有限,所以在这次课程设计过程中,我们了解了很多函数的功能,并且对于其在程序中的使用有了更多的认识。
3) 平时看课本时,有时问题老是弄不懂,做完课程设计,那些问题就迎刃而解
了。
而且还可以记住很多东西。
比如一些程序功能的实现,平时看课本,这次看了,下次就忘了,通过动手实践让我们对各个函数印象深刻。
认识来源于实践,实践是认识的动力和最终目的,实践是检验真理的唯一标准。
所以这两个星期的课程设计对我们的作用是非常大的。
经过两个星期的学习,过程曲折可谓一语难尽。
在此期间我们也失落过,也曾一度热情高涨。
从开始时满富盛激情到最后汗水背后的复杂心情,点点滴滴无不令我回味无长。
此次课程设计,学到了很多课内学不到的东西,比如独立思考解决问题,出现差错的随机应变,和与人合作共同提高,都受益非浅,今后的制作应该更轻松,自己也都能扛的起并高质量的完成项目。
在此,感谢孙老师的细心指导,也同样谢谢其他各组同学的无私帮助!
5小结
在这次的课题设计中,更具体的了解到本次课题设计所需要的元件,比
如元件的原理和使用用途,以及需要注意的地方。
更进一步地熟悉了芯片的结构及掌握了各芯片的工作原理和其具体的使用方法,锻炼了自己独立思考问题的能力和通过查看相关
资料来解决问题的习惯。
在设计的过程中,选择适合的元件是重要的,但更需要懂得把各个元件之间恰当的组装在一起。
任何一个元件的设计最终需要市场,选择元件的过程中还要考虑芯片的市场价值,尽量使用功能俱全,价格便宜的元件。
以符合市场的需要。
当安装与调试做好之后,做成 WORD 文档,在这过程中,又对 WORD 的文档进一步的学习和使用,更利于了我的学习.智能仪表课程设计是自动化专业的专业实践课程。
本课程的任务是通过设计完成一个具有完整功能的单片机系统,是学生掌握目前典型自动化仪表的一般设计要求和设计方法,掌握开发及设计工具的使用方法,通过这一设计实践过程,锻炼学生的动手能力和分析、解决问题的能力;培养对所学知识的综合应用能力。
随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展本设计是数据采集及处理,显示系统与单片机有效结合,本设计是通过在“单片机原理及应用”课堂上学习的知识的综合应用,以及查阅资料,培养一种自学的能力。
并且引导一种创新的思维,把学到的知识应用到日常生活当中。
在设计的过程中,不断的学习,思考和同学间的相互讨论,运用科学的分析问题的方法解决遇到的困难,掌握单片机系统一般的开发流程,学会对常见问题的处理方法,积累设计系统的经验,充分发挥教学与实践的结合。
全能提高个人系统开发的综合能力,开拓了思维,为今后能在相应工作岗位上的工作打下了坚实的基础
带秒表/时钟计时器,万年历的显示屏设计。
基本功能要求:
1. 可动态左右,上下显示“中国计量学院欢迎你”;
2. 在5秒按键无操作则以24h(小时)计时方式显示时、分、秒;
3. 使用按键开关可实现时分调整;
4. 具有闹钟功能,声光提示
扩展功能:
1. 数字时钟/圆形时钟显示可转换;
2. 显示汉字可设置;
3. 可232通讯显示计算机传送字符;
4. 其他扩展功能。
方案确定
经过小组全体组员讨论,最终确立方案制作时钟。
在时钟基本功能实现的基础上,小组成员对扩展功能进行讨论并达成共识。
最终决定设计的时钟除基本功能外,还具有以下扩展功能:
1.可以显示,设置年,月,日,并且有闰年补偿功能。
2. 2. 可以上下滚动左右滑动显示字符串功能;
3. 3. 可以自定义汉字功能;
4.可以232通讯,显示出字符功能;
5. 5. 具有温度显示功能;
6. 6. 具有断电时间保护功能。
通过此次课程设计,单片机系统的设计能力有了很大的提高。
因为以前参见过学校的电子设计大赛,我负责的是硬件,本着全面发展的原则,我这次负责软件,工训的张科曾说过,“数字钟就是软件编程,如果把数字钟的程序变好,以后就没有编不出的程序了”,虽然因为伙伴们的选择,最终没能才加成次培训,但是我还是深深地记住了这句话,在这次课程设计里,我从一开始负责的就是软件,看数据手册,写驱动,调试,优化,每个白天,每个夜晚,我都在全身心的投入其中,终于在开发板上实现了全部功能,先于硬件做出结果,然后由于硬件有错误,我有参与了硬件的调试,和与软件的整合,在这半个月里,我获得了很大的提高,以前一些不熟悉的知识,方法,现在掌握了,不知道的知识,现在熟悉了,希望以后又更多的机会。
在这次课程设计中,我们团队配合的很好,在开
始分工明确,并且经常讨论。
虽然遇到过分歧,但大家各抒己见,进行思想风暴,发现问题,讨论问题,解决问题,我们一次又一次的进行这个工作,终于在我们三名同学的配合下完成了这个课程设计,锻炼了我的团队合作能力。
圆盘时钟:指的是圆盘时钟,也就是说,有时针分针秒针显示的时钟,这一模块中,需要绘制各个时针,有我的同伴完成,具体实现过程我也限于了解,是先把默认原点坐标移动到中心处,然后分别画刷填充等,定义好指针的形状颜色后,分别画出时针分针秒针,读取当前时间,将各指针每段时间应该旋转的角度计算并设定好,就构成了圆盘时钟了。
电子时钟:我们把它定义为向电子表那样显示的时钟部分,每秒更新一次,并显示出来。
默认状态下,显示的数字位数(包括他们之间的冒号)为5为,这时候,显示的只有小时和分钟。
所以要先将它改为8位的格式,让它把小时、分钟、秒钟都显示出来。
日历:日历就是显示当前日历,并能查询前后的日历。
首先要为日历创建一个表格布局,并将其设置成布局尺寸不变,就是说,日历的布局不会随着窗口的拉大而改变大小。
用setGridVisible(true)将表格线设置为显示,这样就能在日历版面看到网格线,比较适合大家的审美习惯。
把日历表添加到表格布局中,这就算初步完成了日历表格的显示了。
当然了,总体模块除了以上三个主要部分,还有对整体的布局也是不可或缺的。
因此,还有一个重要的模块便是整体布局,整体布局时,分为水平布局和垂直布局,水平布局用来布局圆盘时钟和电子时钟并行排列,组合之后,和日历的布局用垂直布局完成。
圆盘时钟和电子时钟的单布局也是用垂直布局完成的。
在这次的课题设计中,更具体的了解到本次课题设计所需要的元件,比
如元件的原理和使用用途,以及需要注意的地方。
更进一步地熟悉了芯片的结构及掌握了各芯片的工作原理和其具体的使用方法,锻炼了自己独立思考问题的能力和通过查看相关资料来解决问题的习惯。
在设计的过程中,选择适合的元件是重要的,但更需要懂得把各个元件之间恰当的组装在一起。
任何一个元件的设计最终需要市场,选择元件的过程中还要考虑芯片的市场价值,尽量使用功能俱全,价格便宜的元件。
以符合市场的需要。
当安装与调试做好之后,做成 WORD 文档,在这过程中,又对 WORD 的文档进一步的学习和使用,更利于了我的学习.智能仪表课程设计是自动化专业的专业实践课程。