没有合适的资源?快使用搜索试试~ 我知道了~
首页用VC++制作_模拟时钟应用程序
资源详情
资源评论
资源推荐

(3)时针、分针和秒针形象美观,即使各指针重合也可辨认。
(4)各指针运动规律正确。为便于演示,时钟速度应比实际时间
快 20 倍,即 1 小时相当于 3 分钟。
(5)数字式时钟的时间显示与指针式时钟显示一致。
(6)按下设置时间按钮或菜单项可弹出一对话框,用于设置当前
的时间和日期。
(7)按下秒表控制按钮后,秒表显示窗中显示从 0 开始的时间,
单位为百分之一秒。再次按下秒表控制按钮后计时停止,该窗口显示
累计时间。
2 问题分析
本题主要涉及到的知识点有:时钟指针运动算法、屏幕重绘方法、
定时器消息、鼠标消息、菜单命令、对话框、画笔/画刷、显示文字等。
指针运动算法和屏幕重绘方法是本程序主要难点所在。
不论何种指针,每次转动均以 π/30 弧度(一秒的角度)为基本单
位,且都以表盘中心为转动圆心。计算指针端点(x, y)的公式如下:
x =圆心 x 坐标 + 指针长度 * cos (指针方向角)

y =圆心 y 坐标 + 指针长度 * sin (指针方向角)
注意,指针长度是指自圆心至指针一个端点的长度(是整个指针
的一部分),由于指针可能跨越圆心,因此一个指针需要计算两个端
点。
三个指针的运动是相关联的,秒针转一圈引起分针运动一格,分
针转一圈引起时针运动一格,因此应该使用一个定时器消息来处理指
针的运动。若用三个定时器消息分别处理时针、分针和秒针的运动,
就会使问题复杂化且不易实现三个指针联动的正确规律。采用一个定
时器消息可以很容易实现指针联动算法。
由于屏幕的重绘速度很快(50 ms 一次),如果采用全屏删除式重
绘则闪烁十分明显,显示效果不佳。本程序采用非删除式重绘,假定
指针将要移动一格,则先采用背景色(这里是白色)重绘原来指针以
删除原来位置的指针,再采用指针的颜色在当前位置绘制指针;如果
指针没有动,则直接绘制指针。
另外,秒表需要采用单独的定时器消息控制。

4 程序清单
按以下步骤向视图类(CClockView)添加下列数据成员及成员函
数。
(1) 添加表示年、月、日、时、分、秒的变量。
int year;
int month;
int day;
int hour;
int minute;
int second;
(2) 添加秒表的计数变量。
int watch;
(3) 添加时钟的画笔及画刷变量。
CPen m_HouPen, m_MinPen, m_SecPen; // 各种针的画笔
CBrush m_MarkBrush; // 表盘标记的画刷
(4) 添加时钟控制变量。
CPoint m_Center; // 表的中心
double m_Radius; // 表的半径
CPoint m_Hour [2], m_OldHour [2]; // 时针当前及前一次位置
CPoint m_Minute [2], m_OldMin [2]; // 分针当前及前一次位置

CPoint m_Second [2], m_OldSec [2]; // 秒针当前及前一次位置
(5) 添加秒表的两个按钮位置变量。
CRect m_WatchStart;
CRect m_WatchStop;
(6) 添加两个函数,计算时钟各指针位置。
void SetClock (int hour, int minute, int second);
CPoint GetPoint (int nLenth, int nValue);
(7) 在视图类构造函数中增加初始化语句:
CClockView::~CClockView()
{
//设定时间
year=2010;
month=11;
day=22;
hour=0;
minute=0;
second=0;
//设定画笔画刷
m_HouPen.CreatePen(PS_SOLID,5,RGB(255,0,0));//时针画笔
m_MinPen.CreatePen(PS_SOLID,3,RGB(0,0,250));//分针画笔
m_SecPen.CreatePen(PS_SOLID,1,RGB(0,0,0));//秒针画笔
m_MarkBrush.CreateSolidBrush(RGB(250,250,0));
剩余18页未读,继续阅读














安全验证
文档复制为VIP权益,开通VIP直接复制

评论0