前言

《指针式时钟》问题分析,功能分析

(1)正确显示系统时钟;

(2)能准确定位时钟刻度和时分秒针的位置;

(3)能随窗口大小的变化而变化。

源码下载链接,本文Sample源码下载地址:C++实现指针式时钟Sample_c++指针式时钟-C++代码类资源-CSDN下载

一、效果图

Sample制作的时钟显示效果如下图所示:

二、部分代码

关键注意查看OnDraw函数内的时钟描画过程

// ClockView.cpp : implementation of the CClockView class
//

#include "stdafx.h"
#include "Clock.h"

#include "ClockDoc.h"
#include "ClockView.h"
#include "math.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/
// CClockView

IMPLEMENT_DYNCREATE(CClockView, CView)

BEGIN_MESSAGE_MAP(CClockView, CView)
//{{AFX_MSG_MAP(CClockView)
// NOTE - the ClassWizard will add and remove mapping macros here.
//    DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
ON_WM_CREATE()
ON_WM_TIMER()
END_MESSAGE_MAP()

/
// CClockView construction/destruction

CClockView::CClockView()
{
// TODO: add construction code here

}

CClockView::~CClockView()
{
}

int CClockView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO:  在此添加您专用的创建代码
SetTimer(1,1000,NULL);//设置定时器1

return 0;
}

BOOL CClockView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
//  the CREATESTRUCT cs

return CView::PreCreateWindow(cs);
}

/
// CClockView drawing

void CClockView::OnDraw(CDC* pDC)
{
CClockDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here

CPen pen(PS_SOLID,5,RGB(255,255,0));
CPen *pOldPen=(CPen*)pDC -> SelectObject(&pen);
static const double pi=3.1415926535;

//得到客户区的矩形
CRect rect;
GetClientRect(&rect);

//得到表盘中央位置,即圆心
int x0 = rect.Width() / 2;
int y0 = rect.Height() / 2;

//得到半径
int r = (x0 > y0 ? y0 : x0);

r = r - 5;

pDC->Ellipse(CRect(x0-r,y0-r,x0+r,y0+r));//画最外侧的圆
CPen Pen2(PS_SOLID,3,RGB(255,0,0));
pDC -> SelectObject(Pen2);
//将要在循环中重复的计算提取出来,减少时间复杂度
//在看代码时请将下列算式代入比较容易理解
double rate = (double)(2.0 * pi / 60.0);
double halfPi=pi/2;
int zoomR=r-20;

//绘制表盘
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255,0,0));
for(int mark=1;mark<=60;mark++)
{
int positionX = (int)(zoomR * sin(rate * mark)+ x0);
int positionY = (int)(-zoomR * sin(rate * mark + halfPi)+ y0);
if(mark % 5 ==0)
{
char number[2];
itoa(mark/5,number,10);//按照十进制转换

//绘制数值
pDC -> TextOut(positionX-5,positionY-5,number);
}
}

CTime time = CTime::GetCurrentTime();
int hour = time.GetHour();
int minute = time.GetMinute();
int second = time.GetSecond();

//绘制秒数指针
CPen secondPen(PS_SOLID,2,RGB(117,254,254));
pDC -> SelectObject(secondPen);
pDC -> MoveTo(CPoint(x0,y0));
int secondX = (int)((zoomR-25) * sin(rate * second)+ x0);
int secondY = (int)(-(zoomR-25) * sin(rate * second + halfPi)+ y0);
pDC -> LineTo(CPoint(secondX,secondY));

//绘制分钟指针
CPen minutePen(PS_SOLID,4,RGB(0,0,255));
pDC -> SelectObject(minutePen);
pDC -> MoveTo(CPoint(x0,y0));
int minuteX = (int)((zoomR-70) * sin(rate * minute)+ x0);
int minuteY = (int)(-(zoomR-70) * sin(rate * minute + halfPi)+ y0);
pDC -> LineTo(CPoint(minuteX,minuteY));

//绘制小时指针/
double hourRate=(double)(2.0*pi/12.0);
if(hour > 12)
{
hour -= 12;
}
CPen hourPen(PS_SOLID,8,RGB(0,255,0));
pDC -> SelectObject(hourPen);
pDC -> MoveTo(CPoint(x0,y0));
int hourX = (int)((zoomR-120) * sin(hourRate * hour )+ x0);
int hourY = (int)(-(zoomR-120) * sin(hourRate * hour + halfPi)+ y0);
pDC -> LineTo(CPoint(hourX,hourY));
}

/
// CClockView printing

BOOL CClockView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}

void CClockView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}

void CClockView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}

/
// CClockView diagnostics

#ifdef _DEBUG
void CClockView::AssertValid() const
{
CView::AssertValid();
}

void CClockView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}

CClockDoc* CClockView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CClockDoc)));
return (CClockDoc*)m_pDocument;
}
#endif //_DEBUG

/
// CClockView message handlers

void CClockView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(nIDEvent==1)
Invalidate();

CView::OnTimer(nIDEvent);
}

C++实现指针式时钟Sample相关推荐

  1. Qt实现 指针式时钟+动态时钟 (详细注释)

    先上效果图: 点击运行后首先是一个指针式时钟窗口,点击Digital Clock->可以跳转到数字时钟窗口,再点击Move Clock->可以还原为指针式时钟窗口 关于整个程序的讲解都在代 ...

  2. 南邮java实验_南邮JAVA程序设计实验4 线程程序设计(指针式时钟)

    南邮JAVA程序设计实验4  线程程序设计(指针式时钟) 实验目的: 本实验旨在通过实验,培养学生将JAVA 线程的相关知识点(包括线程调度,线程同步等)有机结合并加以综合应用,在实验中设计多线程程序 ...

  3. 【时钟识别】基于matlab GUI Hough变换指针式时钟识别【含Matlab源码 2085期】

    ⛄一.简介 1 仪表示数识别流程 基于刻度准确定位的指针式仪表示数识别方法包括预处理.指针检测.刻度定位.油位计表盘中心拟合与仪表读数计算5个部分.该方法无需预先添加任何表盘信息,算法流程如图2所示. ...

  4. 基于STM32设计的指针式电子钟与万年历

    1. 项目简介 这是基于STM32设计的一个指针式电子钟+万年历小项目,采用3.5寸的LCD屏显示时钟,日历.温度.天气,支持触摸屏调整设置时间,设置闹钟,查看日历等等.整体项目主要是技术点就是LCD ...

  5. 用指针式万用表欧姆档检测发光二极管

    由于发光二极管的导通电压一般为1.7V以上,而一般指针式万用表的RX1.RXl0.RX100.RXlk挡内部测量电路的电池通常是1.5V,不能使发光二极管导通,所以以上各挡均不能用来测试发光二极管的好 ...

  6. 如何识别一个指针式的时种的时间?

    如何识别一个指针式的时种的时间? https://www.cnblogs.com/zjutlitao/p/4187476.html 转载于:https://www.cnblogs.com/AlvinL ...

  7. echarts指针进度条刻度调整_指针式流量开关

    流量开关属于电工电器行业开关类目,可对各种液体流量进行监测和发讯控制.被广泛应用于管道中流量的监测及各种大.中.小型设备的冷却.润滑系统中.这就不得不说下它独特的流线型结构设计,准确稳定其性能了,具体 ...

  8. 15b万用表怎么测电容_指针式万用表和数字式万用表的使用与口诀,值得收藏!...

    来源:制冷百科 如有侵权,请联系删除 正确使用万用表,不仅能快速的判断出故障部位,还能防止电器设备和万用表本身的损坏.下面是使用万用表的一些口诀. 测量先看挡,不看不测量 测量不拨挡,测完拨空挡 表盘 ...

  9. 高中电子技术——指针式万用表调零

    前言:数字式万用表不需要自己手动调零,下面整理下指针式万用表的手动调零过程. 1. 机械调零   机械调零目的是指针初始值与零刻度线重合,做法如下: 断开两支表笔 用一字螺丝刀调整位于表盘中间的机械调 ...

最新文章

  1. 计算机三级考试在线免费题库,国家三级计算机考试题库.docx
  2. iOS开发UIlabel篇:iOS 10 3 Label设置的中划线突然失效了
  3. handler回调主线程_Android使用Handler实现子线程与子线程、子线程与主线程之间通信...
  4. java求反字符_java 反取字符串
  5. DNN中多任务学习概述
  6. 单位内部一个计算机系统属于,2012年计算机一级MsOffice第五十九套练习题及答案解析...
  7. C++ 学习之旅(5)——设置Setup文件目录
  8. 「干货」不逼自己一下不知道自己多牛逼[python篇]
  9. python 错误AttributeError: ‘dict_keys‘ object has no attribute ‘sort‘
  10. Delphi 调用Domino Lotus OA
  11. 可变参数函数的一个简单例子
  12. 采购物联网卡如何选择流量套餐
  13. (CVPR 2020) RandLA-Net: Efficient Semantic Segmentation of Large-Scale Point Clouds
  14. 关于短路保护的三极管详解
  15. JSONObject排序问题
  16. dss linux 摄像头 rtsp,用VLC读取摄像头产生RTSP流,DSS主动取流转发(一)(二) 【转】...
  17. NIO与Netty编程(三)之Netty编程
  18. 1789: 高精度A+B
  19. Oracle如何实现跨数据库查询
  20. 对lea与mov的理解

热门文章

  1. 算法面试,是要考考你的基本盘
  2. UVA11400:简单dp
  3. 大厂卡你的学历,究竟是为了什么?
  4. 第1章 数字图像处理绪论
  5. 新H5中用canvas画一个数字钟表
  6. java学习笔记 java编程思想 第6章 访问权限控制
  7. f_sync有大用但不可以滥用
  8. 清华大学推荐人工智能A类B类期刊与会议汇总!!!发论文必备
  9. 仿百度搜索框自动下拉提示
  10. 经典论文翻译导读之《A Bloat-Aware Design for Big Data Applications》