面向对象程序设计报告
- 格式:doc
- 大小:279.50 KB
- 文档页数:19
VS 2010课程设计报告
学生姓名 张雨荷 ___ _
学 号 1304120309 ___ _
专业班级 数学科学1201_ _
指导老师 刘圣军_________ _
数学与统计学院
2014.9 一、课程设计目的
时钟几乎是每个人必备的生活用品,虽小却非常重要。一款精美的时钟可以给人们带来极大的便利。现在关于时钟的各种应用程序层出不穷,我的目的是设计一款界面简单、方便易用、功能相对丰富的指针式时钟程序。为了达到上述目标,满足课程设计的要求,我结合自身情况,选择了PC平台、Windows操作系统、Visual Studio开发平台、MFC框架来实现自己的程序。希望能通过自己这款小应用程序的设计,来掌握面向对象的程序设计方法,了解面向对象的设计技巧,有效地、深刻地理解课程内容,体会理论、方法和设计原则;培养分析实际问题和解决问题的能力,具备使用面向对象程序设计开发工具设计实际系统的能力。
二、课程设计内容及要求
程序所实现的功能:运行界面是一款指针式时钟,包括时、分、秒三个指针,有12个钟点的显示,并通过指针的转动来实时更新时间,同时可以显示相应时间的数字时钟形式。通过菜单可以实现闹铃功能、表盘及指针颜色设置、倒计时等功能。同时为程序窗口添加了一张精美图片作为背景。
三、系统设计
各模块关系图 时钟程序
时间查看功能 工作状态设置 颜色设置功能
开始工作 暂停工作 倒计时功能 表盘颜色设置 时针颜色设置 分钟颜色设置 闹铃功能 秒针颜色设置
主程序及其主要模块的流程图 绘制时钟指针
制作数字时钟 绘制表盘刻度
关闭 时钟功能选择
结束 同步时间 填充背景 开始 四、用户手册
1、windows系统visual studio 2010设计
2、本程序不需要安装使用,直接运行即可弹出时钟对话框
3、程序示意图
图1 时钟主界面
图2 程序功能界面
图3 倒计时时间设置界面 图4 闹铃时间设置界面
打开功能列表可以选择各个功能,图3为选择倒计时功能弹出的对话框,图4为选择闹铃功能弹出的对话框。
图5 表盘及指针颜色设置界面
选择设置表盘或者指针颜色时都会弹出图5,选择喜欢的颜色点击确定后即可改变颜色。
五、程序清单
(1)视图类的构造函数
CShejiView::CShejiView()
{
// TODO: add construction code here
CBitmap bmp;//定义一个位图类型的变量。
bmp.LoadBitmap(IDB_BITMAP1); ///加载位图
m_brushBackground.CreatePatternBrush(&bmp); ///创建位图画刷
CTime curtime = CTime::GetCurrentTime();//同步系统时间 m_hour = curtime.GetHour();
m_minute = curtime.GetMinute();
m_second = curtime.GetSecond();
flag=0;//时钟正常工作状态
flag2=1;//倒计时无效;
hour=-1;
minute=-1;
set=0;
}
(2)ondraw()函数进行绘制
void CShejiView::OnDraw(CDC* pDC)
{
CShejiDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CRect rect;
GetClientRect(rect);///取得客户区域
pDC->FillRect(rect,&m_brushBackground); ///用背景画刷填充区域,而我们在mbrushbackground里加载了位图,所以理所当然就变成了我们设置的图片
//画表盘,标注刻度
GetClientRect(&client);
int centerX = client.Width()/2;
int centerY = client.Height()/2;
int clockRadius = centerX>centerY ? centerY : centerX;//用较小的一个作为钟表的半径,避免半径太大矩形放不开
clockRadius = clockRadius * 0.9; int keduDRadius = clockRadius * 0.85;
int keduXRadius = clockRadius * 0.95;
int hourRadius = clockRadius * 0.3;//时针半径
int minuteRadius = clockRadius * 0.5;//分针半径
int secondRadius = clockRadius * 0.7;//秒针半径
//CPenclockPen(PS_SOLID, 2, RGB(0,0,255));
CPen clockPen(PS_SOLID, 2, bpcolor);//配合下面的执行代码,使用自己定义的画笔来设置表盘的颜色
CPen * oldPen = pDC->SelectObject(&clockPen);//恢复到原来的画笔
//标注刻度
for(int i = 0; i< 12; i++)
{
pDC->MoveTo(centerX + keduDRadius * cos(i * 30 * PI / 180),
centerY + keduDRadius * sin(i * 30 * PI / 180));
pDC->LineTo(centerX + clockRadius * cos(i * 30 * PI / 180),
centerY + clockRadius * sin(i * 30 * PI / 180));
}
for(int j = 0; j< 60; j++)
{
pDC->MoveTo(centerX + keduXRadius * cos(j * 6 * PI /
180),//keduxradius是0.95,更加接近圆周,所以比起时针当然理所当然的更短
centerY + keduXRadius * sin(j * 6 * PI / 180));
pDC->LineTo(centerX + clockRadius * cos(j * 6 * PI / 180),
centerY + clockRadius * sin(j * 6 * PI / 180));
} pDC->SelectObject(oldPen);
//调节时,分,秒针角度显示的关系
double secondRadians = m_second * 2 * PI / 60; //一个圆周是2pi,共有60秒,所以一秒是左边这个表达式,用的是弧度值
double minuteRadians = m_minute * 2 * PI / 60 + secondRadians /
60;//秒针每动一格,其效果等同于分针动1/60格
double hourRadians = m_hour * 2 * PI / 12 + minuteRadians*5 / 60;
//依照所计算的角度画出时,分,秒针
//CPensecondPen(PS_SOLID, 2, RGB(0,255,0));
CPen secondPen(PS_SOLID,2,secondcolor);
oldPen = pDC->SelectObject(&secondPen);
pDC->MoveTo(centerX , centerY);//时针的起点在中心
pDC->LineTo(centerX + double(secondRadius) * sin(secondRadians),
centerY - double(secondRadius) * cos(secondRadians));
pDC->SelectObject(oldPen);
//CPenminutePen(PS_SOLID, 4, RGB(255,255,0));
CPen minutePen(PS_SOLID, 4, minutecolor);
oldPen = pDC->SelectObject(&minutePen);
pDC->MoveTo(centerX , centerY);
pDC->LineTo(centerX + double(minuteRadius) * sin(minuteRadians),
centerY - double(minuteRadius) * cos(minuteRadians));
pDC->SelectObject(oldPen);
//CPenhourPen(PS_SOLID, 8, RGB(255,0,255));
CPen hourPen(PS_SOLID,8,hourcolor); oldPen = pDC->SelectObject(&hourPen);
pDC->MoveTo(centerX , centerY);
pDC->LineTo(centerX + double(hourRadius) * sin(hourRadians),
centerY - double(hourRadius) * cos(hourRadians));
pDC->SelectObject(oldPen);
//画表盘中心
CBrush abrush(RGB(255,0,0));
CBrush * oldbrush = pDC->SelectObject(&abrush);
pDC->Ellipse(centerX - 8, centerY - 8 , centerX +8, centerY +8);//最左是圆心减8,最右是圆心加8
pDC->SelectObject(oldbrush);
//定义数字时钟的位置,显示当前时间
CRect dianzibiao(centerX-52,centerY*6/15, centerX+52,centerY);
CString shijian;
char temp1[3], temp2[3], temp3[3];
_itoa_s(m_hour, temp1, 10);
_itoa_s(m_minute, temp2, 10);//ITOA功能,把一整书转换为字符串,10进制
_itoa_s(m_second, temp3, 10);
shijian.Insert(0, temp1);//temp1用来保存小时,temp2用来保存分钟,temp3用来保存秒