时钟设计课程论文.docx
- 文档编号:4312233
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:28
- 大小:174.75KB
时钟设计课程论文.docx
《时钟设计课程论文.docx》由会员分享,可在线阅读,更多相关《时钟设计课程论文.docx(28页珍藏版)》请在冰豆网上搜索。
时钟设计课程论文
西北农林科技大学信息工程学院
C++实习报告(或论文)
题目:
桌面时钟的设计与实现
目录
一、综合训练目的与要求1
二、综合训练任务1
三、总体设计1
四、详细设计说明1
五、调试与测试1
六、实习日志1
七、实习总结1
八、附录:
核心代码清单1
一、综合训练目的与要求
正文训练的目的:
通过实习对以前所学的面向对象C++能够有一个更好的了解,可以熟练的运用C++,做到学以致用;对VisualStudio2005可以较为熟练的操作,可以熟练的运用VisualStudio2005编译代码,调试程序;通过这两个礼拜的实习,了解并可以运用MFC设计界面,以及各类消息的函数实现,为这次实习打好基础。
训练的要求:
在实习期间,每天要按时到达实习地点,尽量不迟到或是早退,并且到了之后应该尽快进入状态,抓紧时间;在两周的实习之中,自己应该做好安排和计划,知道在每个时间段应该做些什么,最重要的是一定要在每个时间段内,提前或是按时完成自己规定的任务,以便为以后的任务留下充足时间;在设计界面与编程阶段要有耐心,细心,认真完成每一模块的制作,并且细心的发现问题,解决问题,最后完成设计,做出令自己满意的成果。
二、综合训练任务
(1)采用面向对象的思想设计设计一个CClokDlg类用于实现桌面时钟,进而完成桌面时钟的设计与实现;
(2)编译并调试程序,不断的发现问题,并且解决问题,使桌面时钟的各种功能都能够完全实现,最后使程序尽量少一些缺陷。
三、总体设计
(1)界面设置:
①表盘背景设置:
对界面背景的设置,分为选择颜色设置或选择图片设置。
②表盘刻度设置:
对界面上整点刻度的形状设置如三角形、方形、菱形,颜色调色设置。
③指针设置:
对界面上时针、分针、秒针以及各自的边框进行各自的颜色设置。
④日期设置:
选择日期在表盘上的位置,是否隐藏,以及日期的颜色设置。
⑤数字时钟设置:
调整设置系统时间,选择数字时钟在表盘上的位置,以及数字时钟的颜色设置。
(2)时间设置:
①闹钟设置:
设置响铃时间,闹钟的铃声设置,选择自己喜欢的歌曲,或者选择蜂鸣铃声。
②系统时间设置:
校准系统时间。
(3)关闭闹钟。
核心类CMyclockDlg类,使所有各个功能的信息交流处理都在这里进行:
类之间的关系图如下图3.1所示:
图3.1
四、详细设计说明
4.1界面设置
1.背景设置如下图4.1所示:
图4.1
背景设置分为颜色背景和图像背景。
二者只能选择其一。
选择颜色背景设置,可以对表盘背景进行颜色设置,将表盘设置为用户所喜欢的颜色;选择图像背景设置,可以对表盘进行图片设置,选好图片的存储路径,就可以将表盘设置为用户所喜欢的图片。
主要代码如下所示:
voidCCMyClockDlg:
:
OnSetBkg()
{
//TODO:
在此添加命令处理程序代码
BackSetDlgdlg;
dlg.m_bPicture=m_bPicture;
dlg.m_colorBK=m_colorBK;
dlg.m_StrBK=m_strBK;
dlg.m_model=m_model;
if(dlg.DoModal()==IDOK)
{
m_bPicture=dlg.m_bPicture;
m_model=dlg.m_bPicture;
m_colorBK=dlg.m_colorBK;
m_strBK=dlg.m_StrBK;
m_model=dlg.m_model;
Invalidate();
}
}
2.表盘设置如下图4.2所示:
图4.2
表盘设置分为表盘刻度的颜色设置和表盘的样式设置:
选择刻度样式设置可以将刻度设置成三角形、菱形、方形、圆形其中之一;选择刻度颜色设置可以将刻度的颜色改成你所喜欢的颜色。
主要代码如下所示:
voidCCMyClockDlg:
:
OnSetScale()
{
ScaleSetDlgdlg;
dlg.m_type=m_ClockScale.GetScaleStyle();
dlg.m_color=m_ClockScale.GetScaleColor();
dlg.m_logcolor=m_ClockScale.GetLogColor();
if(dlg.DoModal()==IDOK)
{
m_ClockScale.SetScaleStyle(MAJORTYPE(dlg.m_type));
m_ClockScale.SetScaleColor(dlg.m_color);
m_ClockScale.SetLogColor(dlg.m_logcolor);
Invalidate();
}
//TODO:
在此添加命令处理程序代码
}
3.指针设置如下图4.3所示:
图4.3
指针设置分为指针颜色设置和指针边框颜色设置:
对界面上时针、分针、秒针以及各自的边框进行各自的颜色设置。
主要代码如下:
voidCCMyClockDlg:
:
OnSetHand()
{
HandSetDlgdlg;
m_Clockhand.GethandColor(dlg.m_HColor,dlg.m_HbordColor,
dlg.m_MColor,dlg.m_MBordColor,
dlg.m_SbordColor);
if(dlg.DoModal()==IDOK)
{
m_Clockhand.SethandColor(dlg.m_HColor,dlg.m_HbordColor,
dlg.m_MColor,dlg.m_MBordColor,
dlg.m_SbordColor);
}
Invalidate();
//TODO:
在此添加命令处理程序代码
}
4.2时间设置
1.系统时间设置如下图4.4所示:
图4.4
系统时间设置:
对系统时间继续校准。
主要的代码如下:
voidCCMyClockDlg:
:
OnSetSysTime()
{
//TODO:
在此添加命令处理程序代码
SystemTimeSetDlgdlg;
if(dlg.DoModal()==IDOK)
{
SYSTEMTIMEtime;
GetSystemTime(&time);
time.wHour=dlg.m_hour;
time.wMinute=dlg.m_minute;
time.wSecond=dlg.m_second;
SetLocalTime(&time);
UpdateData(true);
}
}
2.闹钟设置如下图4.5所示:
图4.5
闹钟设置分为闹钟时间设置和闹钟铃声设置:
设置响铃时间,闹钟的铃声设置,选择自己喜欢的歌曲,或者选择蜂鸣铃声。
主要代码如下:
voidCCMyClockDlg:
:
Alarm()//判断是否响铃
{
if(m_clock.m_Sound)
{
if(m_clock.m_strAlarmMusic!
="")
{
boolbend=PlaySound(m_clock.m_strAlarmMusic,NULL,MessageBox(_T("闹钟时间到了!
\n\n铃声:
")+m_clock.m_strAlarmMusic,_T("温馨提示")));
}
else
{
MessageBox(_T("闹铃时间到了!
\n\n铃声无法打开铃声:
"+m_clock.m_strAlarmMusic,_T("温馨提示")));
}
}
else
{
BeepThread(this);
MessageBox(_T("闹铃时间到了!
\n\n蜂鸣声"),_T("温馨提示"));
}
}
voidCCMyClockDlg:
:
OnTimeAlarm()//选择铃声
{
//TODO:
在此添加命令处理程序代码
AlarmSetDlgdlg;
dlg.m_bMusic=m_clock.m_bMusic;
dlg.m_bSound=m_clock.m_Sound;
dlg.m_strAlarmMusic=m_clock.m_strAlarmMusic;
dlg.m_typeBeep=m_clock.m_typebeep;
if(dlg.DoModal()==IDOK)
{
m_clock.m_bMusic=dlg.m_bMusic;
m_clock.m_Sound=dlg.m_bSound;
m_clock.m_strAlarmMusic=dlg.m_strAlarmMusic;
m_clock.m_typebeep=dlg.m_typeBeep;
m_clock.oTime.wYear=dlg.m_pickerTime.GetYear();
m_clock.oTime.wMonth=dlg.m_pickerTime.GetMonth();
m_clock.oTime.wDay=dlg.m_pickerTime.GetDay();
m_clock.oTime.wHour=dlg.m_hour;
m_clock.oTime.wMinute=dlg.m_minute;
m_clock.oTime.wSecond=dlg.m_second;
}
}
指针及表盘上各点的位置确定:
CPointCClockScale:
:
ComputerFacePoint(UINTmin,intnFaceLength)
{
CPointptCalc;
constdoublePI=3.141592653;
doublefDegrees=180+((15+min)%60)*6;
doublefAngle=fDegrees/180;
ptCalc.x=m_ptMiddle.x+(int)(cos(fAngle*PI)*nFaceLength);
ptCalc.y=m_ptMiddle.y+(int)(sin(fAngle*PI)*nFaceLength);
return(ptCalc);
}
五、调试与测试
1、在设置背景的时候,开始背景图片一致贴不到表盘上面,显示不出来效果,后来发现时读取图片路径的时候,类型转化不正确,读取的路径都是乱码,后来找到方法把类型转化好了,但是问题依然没解决,后来经过老师的指导,才发现是图片的格式不正确,后来图片格式弄好,就成功了。
2、在计算表盘指针坐标的时候,总出现意外,最后没办法,一遍一遍的跟踪,将跟踪记录记录到纸上分析,最后是几个坐标颠倒了,改正后就好了。
六、实习日志
2月25日~2月26日:
通过网络和相关书籍了解有关时钟的相关知识,熟悉桌面时钟的运转规则和其主要算法,以及如何设置闹钟,添加背景,;
2月27日~2月28日:
下载有关MFC的相关资料,并且在尽量在最短的时间内学会一些基本知识,例如如何生成对话框,为按钮添加消息函数等;
3月01日:
在VisualStudioS2005中设计出时钟所需要的各种对话框,以及相应按钮,并且为按钮添加消息响应函数;
3月02日~3月05日:
为各种消息相应函数实现其功能,实现时钟的走时对时和闹钟,数字时钟以及当前日期的显示,设置界面所有项目的颜色设置;
3月06日~3月07日:
完成实施计划书和课程论文的制作,并且为课程答辩做好相关的准备。
七、实习总结
这两个周的面向对象课程设计,时间上说长不长,说短也不短,却让我学到了很多,第一点就是:
MFC以前从来没有听过的名词,现在我就知道了用它可以设计界面,还可以使用它,尽管不是很熟练。
还有VS2005真的很强大,跟它相比,codeblocks就只是合适教学,开发软件差很多。
你觉得自己了解一点,是总会发现还有很多自己所不懂的东西,还有很多自己所没探知的领域,很多知识运用到实践中很有一定的难度,看着自己和同学的程序运行结果,突然发现C++真的很神奇,居然能做出那么漂亮的软件。
在我们上机调试程序的过程中,我遇到了很多的问题,说实话这次课程设计自己没有出多大的力,好多东西多是借鉴书上的,自己设计是总是觉得没有头绪,无从下手。
后来我发现把书多看几遍真的会有很多收获,对自己的编程也会有很大的提高。
我觉得课程设计不仅让我们巩固了所学的知识,还使得我们学习到了更多平时所忽略的,最重要的是,它磨砺了我们,让我们在大学的下一个阶段能更好的成长。
八、附录:
核心代码清单
CCMyClockDlg:
:
CCMyClockDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CCMyClockDlg:
:
IDD,pParent)
{
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_strBK="..\\BMP\\1.bmp";//初始化表盘背景
m_colorBK=RGB(255,255,255);
m_bPicture=TRUE;
m_model=1;
SYSTEMTIMEtime;
GetLocalTime(&time);
m_oTime=time;
m_nMinute=time.wMinute;
m_nHour=time.wHour;
if(m_nHour>12)
m_nHour=m_nHour-12;
m_nSecond=time.wSecond;
m_numShow=1;
m_dateShow=1;
}
BOOLCCMyClockDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//将“关于...”菜单项添加到系统菜单中。
//IDM_ABOUTBOX必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//设置此对话框的图标。
当应用程序主窗口不是对话框时,框架将自动
//执行此操作
SetIcon(m_hIcon,TRUE);//设置大图标
SetIcon(m_hIcon,FALSE);//设置小图标
//TODO:
在此添加额外的初始化代码
SetTimer(1,1000,NULL);
returnTRUE;//除非将焦点设置到控件,否则返回TRUE
}
voidCCMyClockDlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog:
:
OnSysCommand(nID,lParam);
}
}
//如果向对话框添加最小化按钮,则需要下面的代码
//来绘制该图标。
对于使用文档/视图模型的MFC应用程序,
//这将由框架自动完成。
voidCCMyClockDlg:
:
OnPaint()
{
CPaintDCdc(this);
CRectrectClient;
GetClientRect(&rectClient);
CDCmemDC;
memDC.CreateCompatibleDC(&dc);
CBitmapbmp;
bmp.CreateCompatibleBitmap(&dc,rectClient.Width(),rectClient.Height());
memDC.SelectObject(&bmp);
if(m_bPicture)
{
CDCbkDC;
bkDC.CreateCompatibleDC(&memDC);
HBITMAPhbitMap;
CBitmapbitmap;
//LPSTRstr=m_strBK.GetString();
hbitMap=(HBITMAP):
:
LoadImageW(:
:
AfxGetInstanceHandle(),m_strBK,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
if(hbitMap==0)
{
m_bPicture=false;
return;
}
bitmap.Attach(hbitMap);
BITMAPpbmp;
bitmap.GetBitmap(&pbmp);
intbh=pbmp.bmHeight;
intbw=pbmp.bmWidth;
bkDC.SelectObject(&bitmap);
if(m_model)
{
memDC.StretchBlt(0,0,rectClient.Width(),rectClient.Height(),&bkDC,0,0,bw,bh,SRCCOPY);
}
else
{
intsx=(rectClient.Width()-bw)/2;
intsy=(rectClient.Height()-bh)/2;
memDC.BitBlt(sx,sy,bw,bh,&bkDC,0,0,SRCCOPY);
}
}
else
{
CBrushbkBrush(m_colorBK);
memDC.FillRect(&rectClient,&bkBrush);
}
m_ptMiddle.x=rectClient.Width()/2;
m_ptMiddle.y=rectClient.Height()/2-15;
doublem_nRidius=min(m_ptMiddle.x,m_ptMiddle.y);
m_nPointWidth=(int)m_nRidius/20;
m_ClockScale.DrawScale(&memDC,m_ptMiddle);
m_Clockhand.DrawHand(&memDC,m_nMinute,MINUTE_TYPE,m_ptMiddle,m_oTime);//这里两个参数要初始化
m_Clockhand.DrawHand(&memDC,m_nHour,HOUR_TYPE,m_ptMiddle,m_oTime);//这里两个参数要初始化
m_Clockhand.DrawHand(&memDC,m_nSecond,SECOND_TYPE,m_ptMiddle,m_oTime);//这里两个参数要初始化
if(m_nPointWidth>6)
{
if(m_numShow)
{
m_ClockNum.DrawTme(&memDC,rectClient,m_oTime);
}
if(m_dateShow)
{
m_ClockDate.DrawDate(&memDC,rectClient,m_oTime);
}
}
dc.StretchBlt(0,0,rectClient.Width(),rectClient.Height(),&memDC,0,0,rectClient.Width(),
rectClient.Height(),SRCCOPY);
if(IsIconic())
{
CPaintDCdc(this);//用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND,reinterpret_cast
//使图标在工作矩形中居中
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//绘制图标
dc.DrawIcon(x,y,m_hIcon);
}
else
{
CDialog:
:
OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标显示。
//
HCURSORCCMyClockDlg:
:
OnQueryDragIcon()
{
returnstatic_cast
}
BOOLCCMyClockDlg:
:
OnEraseBkgnd(CDC*pDC)//避免闪屏问题。
{
//TODO:
在此添加消息处理程序代码和/或调用默认值
returntrue;
}
voidCCMyClockDlg:
:
OnTimer(UINT_PTRnIDEvent)
{
//TODO:
在此添加消息处理程序代码和/或调用默认值
SYSTEMTIMEtime;
GetLocalTime(&time);
m_oTime=time;
m_nSecond=time.wSecond;
m_nMinute=time.wMinute;
m_nHour=time.wHour;
if(IsAlarmTime())
{
Alarm();
}
Invalidate();
CDialog:
:
OnTimer(nIDEvent);
}
boolCCMyClockDlg:
:
IsAlarmTime()
{
boolbYear=(m_clock.oTime.wYear==m
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 时钟 设计 课程 论文