时钟设计课程论文.docx

上传人:b****3 文档编号:4312233 上传时间:2022-11-29 格式:DOCX 页数:28 大小:174.75KB
下载 相关 举报
时钟设计课程论文.docx_第1页
第1页 / 共28页
时钟设计课程论文.docx_第2页
第2页 / 共28页
时钟设计课程论文.docx_第3页
第3页 / 共28页
时钟设计课程论文.docx_第4页
第4页 / 共28页
时钟设计课程论文.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

时钟设计课程论文.docx

《时钟设计课程论文.docx》由会员分享,可在线阅读,更多相关《时钟设计课程论文.docx(28页珍藏版)》请在冰豆网上搜索。

时钟设计课程论文.docx

时钟设计课程论文

 

西北农林科技大学信息工程学院

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(dc.GetSafeHdc()),0);

//使图标在工作矩形中居中

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(m_hIcon);

}

 

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1