C++图形时钟(画图入门篇)
第一次接触制作窗口画图感觉还不错,听老师讲过后写的,希望对大家有帮助。
本次工程是制作一个圆形和方形时钟,涉及画图操作,先介绍一下画图库(ACLLib)的用到的函数;

1.图形库的介绍(这里只介绍此工程用到的函数,想额外了解的可以百度此库的名称)
ACLLib是一个基于Win32API的函数库,提供了相对较为简单的方式来做Windows程序,同时也是一个C语言图形库
需要Setup是ACLLib程序的入口/启动函数 ,其意义等同于main函数 ;
一般框架为:

#include "acllib.h"int Setup(){initWindow("test",DEFAULT,DEFAULT,width,width);return 0;
}

画图稍显需要构建一个窗口
函数原型为: void initWindow(const char title[] , int left , int top , int width , int height);
参数含义依次为:窗口标题,窗口左边起始坐标,上面起始坐标,窗口宽度,窗口高度。

如果在窗口上画图需要把画图部分放在*beninPaint()endPaint()*之间,分别代表画图的开始和画图的结束。
另外需要注意的是在Windows中,坐标是以像素点的数字来定义的,左上角是(0,0),x轴自左向右增大,而y轴自上向下增大。

void setPenWidth(int width) ;//设置画笔的宽度,单位为像素点
void ellipse(int Leftx, int TopX ,int width,int height);//画椭圆(起点下,y;宽度高度)
void rectangle(int Leftx, int TopX ,int width,int height);//画矩形(起点下,y;宽度高度)
void moveTo(int x, int y); //把当前坐标移动到(x,y)
void lineTo(int x,int y); //从当前点画线到(x,y)
setPenColor(ACL_Color newColor); //设置画笔颜色
setBrushColor(ACL_Color newColor); //设置所画区域颜色

2. 获取系统时间

#include<stdio.h>
#include<time.h>
int main()
{time_t timer = time(NULL);printf("ctime is %s\n", ctime(&timer));//得到日历时间return 0;
}

需要注意的是别忘记加头文件 “time.h”,time.h是C/C++中的日期和时间头文件。用于需要时间方面的函数。

3. 做时钟
终于到我们的时钟部分了,首先和别的项目一样都需要先建立项目的类
在这里我们建立时钟类。(注释应该算比较详细啦,就不一一介绍了)

clock.h

class Clock
{
private:int h,m,s,z;SHAPE shape;    //形状void EllipseShape(int x,int y,int width,int height);void RectangleShape(int x,int y,int widht,int height);
public://根据电脑时间初始化时钟,缺省是椭圆Clock(SHAPE  s=ellipseShape);//默认圆形时钟,指明方形才是方形//根据指定时间初始化时钟Clock(int z,int h,int m,int s,int shape);//根据已经存在的时钟初始化该时钟Clock(Clock &);~Clock(void);//设置时间void SetTime(int h,int m,int s);//获取时间void GetTime(int &h,int &m,int &s);//设置时区void SetZone(int z);//获取时区int GetZone();//时间增1void AddOneS();//获取形状,注意:时钟生成后,不能修改形状,所以没有设置形状的函数SHAPE GetShape();void DispTime();  //显示时间void DrawMyClockWithShape(int x,int y,int w,int h);//画时钟
};

clock.c


#include<iostream>
#include"Clock.h"
#include"acllib.h"
#include"time.h"
#include"math.h"
using namespace std;Clock::Clock(SHAPE  shape)
{/*****************************/time_t t;   struct tm tmm;//h=m=s=0;t = time(NULL);//获取系统时间localtime_s(&tmm,&t);//把时间给tmmh=tmm.tm_hour;m=tmm.tm_min;s=tmm.tm_sec;/**********获得时间格式********************/z=8;this->shape=shape;
}Clock::~Clock(void)
{
}
//根据指定时间初始化时钟
Clock::Clock(int z,int h,int m,int s,int shape)
{this->z=z;this->h=h;this->m=m;this->s=s;this->shape;
}//根据已经存在的时钟初始化该时钟
Clock::Clock(Clock &c)
{z=c.z;h=c.h;m=c.m;s=c.s;shape=c.shape ;
}
//设置时间
void Clock::SetTime(int h,int m,int s)
{this->h=h;this->m=m;this->s=s;
}//获取时间
void Clock::GetTime(int &h,int &m,int &s)
{h=this->h;m=this->m;s=this->s;
}//设置时区
void Clock::SetZone(int z)
{this->z=z;
}//获取时区
int Clock::GetZone()
{return this->z;
}
void Clock::DispTime()
{cout<<"时区:"<<z<<"时间: "<<h<<":"<<m<<":"<<s<<endl;
}
void Clock::AddOneS()
{s++;if(s>=60){m++;s=0;if(m>=60){m=0;h++;if(h>12){h=0;}}}
}
//下面的椭圆绘制来自于acllib的samples
double RAD(double x)
{return ((x)/360.0*2*3.1415926535);
}void Clock::DrawMyClockWithShape(int x,int y,int width,int height)
{switch(shape){case ellipseShape: EllipseShape(x,y,width,height);break;case rectangleShape:RectangleShape(x,y,width,height);break;}
}//获取时钟形状
SHAPE Clock::GetShape()
{return shape;
}//画圆型时钟
void Clock::EllipseShape(int x,int y,int width,int height)
{int ox =x+ width/2;//150;int oy =y+ height/2;//150;int min=width<height?width:height;int hl = min/4-min/7;//46;int ml = min/3-min/6;//74;int sl = min/2-min/5;//120;int i;// circlesetPenWidth(2);   //设置画笔粗细setPenColor(BLACK);  //设置画笔颜色setBrushColor(WHITE);//设置背景颜色ellipse(x,y,x+width,y+height);    //椭圆大小位置// labelsetPenWidth(1);setPenColor(BLACK);int len1=min/2-min/8,len2=len1+10;for(i=0;i<12;++i){moveTo(ox+len1*sin(RAD(180-i*30)),oy+len1*cos(RAD(180-i*30)));lineTo(ox+len2*sin(RAD(180-i*30)),oy+len2*cos(RAD(180-i*30)));}// hoursetPenWidth(8);setPenColor(BLACK);moveTo(ox,oy);lineTo(ox+hl*sin(RAD(180-h*30)),oy+hl*cos(RAD(180-h*30)));// minutesetPenWidth(4);setPenColor(GREEN);moveTo(ox,oy);lineTo(ox+ml*sin(RAD(180-m*6)),oy+ml*cos(RAD(180-m*6)));// secondsetPenWidth(2);setPenColor(RED);moveTo(ox,oy);lineTo(ox+sl*sin(RAD(180-s*6)),oy+sl*cos(RAD(180-s*6)));}
void Clock::RectangleShape(int x,int y,int width,int height)
{//矩形中心/圆心位置int ox =x+ width/2;//150;    int oy =y+ height/2;//150;int min=width<height?width:height;int hl = min/4-min/7;//46;int ml = min/3-min/6;//74;int sl = min/2-min/5;//120;int i;// circlesetPenWidth(2);setPenColor(BLACK);setBrushColor(WHITE);   //表盘为白色rectangle(x,y,x+width,y+height);//画框// labelsetPenWidth(1);setPenColor(BLACK);int len1=min/2-min/8,len2=len1+10;for(i=0;i<12;++i)//表针{moveTo(ox+len1*sin(RAD(180-i*30)),oy+len1*cos(RAD(180-i*30)));lineTo(ox+len2*sin(RAD(180-i*30)),oy+len2*cos(RAD(180-i*30)));}// hoursetPenWidth(8);setPenColor(BLACK);moveTo(ox,oy);lineTo(ox+hl*sin(RAD(180-h*30)),oy+hl*cos(RAD(180-h*30)));// minutesetPenWidth(4);setPenColor(GREEN);moveTo(ox,oy);lineTo(ox+ml*sin(RAD(180-m*6)),oy+ml*cos(RAD(180-m*6)));// secondsetPenWidth(2);setPenColor(RED);moveTo(ox,oy);lineTo(ox+sl*sin(RAD(180-s*6)),oy+sl*cos(RAD(180-s*6)));}

下面就是主函数了
srand((unsigned)time(NULL));
s = rand() % 2;
这两句的意思是根据时间生成随机数然后对2取余。

下面是ACLLib库里的定时器函数
registerTimerEvent(timerEvent); //配置定时器 括号里为定时器函数名称
void startTimer(int id,int timeinterval) //设置定时器 一秒 参数为定时器id ,定时时间us
void timerEvent(int tid) //定时器中断函数参数为定时器id;

下面是我们的主函数代码
main.cpp

#include "acllib.h"
#include"Clock.h"
#include<stdio.h>
#include <stdlib.h>
#include<time.h>
#include <math.h>#define RAD(x) ((x)/360.0*2*3.1415926535)//把角度转化为弧度Clock *c1,*c2;
int s, pos;
void timerEvent(int tid)  //定时器函数
{beginPaint();    //画图开始clearDevice();   //清图if (s == 0){c1->AddOneS();c1->DrawMyClockWithShape(30, 30, 250, 250);}else{c2->AddOneS();c2->DrawMyClockWithShape(30, 30, 250, 250);}endPaint();  //画图结束
}int Setup()
{initWindow("Clock",DEFAULT,DEFAULT,400,300);   //画一个窗口registerTimerEvent(timerEvent);    //配置定时器c1 = new Clock;      //生成圆形时钟c1c2 = new Clock(rectangleShape);//生成矩形时钟c2srand((unsigned)time(NULL));  s = rand() % 2;      //根据时间生成随机数startTimer(0,1000);   //设置定时器  一秒return 0;
}

C++图形时钟(画图入门篇)相关推荐

  1. matlab画图入门篇--各种基本图形绘制的函数与实例【转载】

    MATLAB画图入门篇--各种基本图形绘制的函数与实例 一. 二维图形(Two dimensional plotting) 1. 基本绘图函数(Basic plotting function):Plo ...

  2. 基于HTML5 Canvas的开源图形组件-ichartjs 入门篇

    ichartjs的官方网站为ichartjs(http://www.ichartjs.com/),目前最新版本为ichartjs v1.2 Released ,ichartjs的官方介绍: ichar ...

  3. Qt 嵌入式图形开发(入门篇)(转)

    一.Qt/Embedded 开发环境的安装 一般来说,居于Qt/Embedded开发的应用程序最终会发布到安装有嵌入式Linux操作系统 的小型设备上,所以使用装有Linux操作系统的PC机或者工作站 ...

  4. R语言学习笔记——入门篇:第三章-图形初阶

    R语言 R语言学习笔记--入门篇:第三章-图形初阶 文章目录 R语言 一.使用图形 1.1.基础绘图函数:plot( ) 1.2.图形控制函数:dev( ) 补充--直方图函数:hist( ) 补充- ...

  5. EGE基础入门篇(六):基本图形

    EGE专栏:EGE专栏 上一篇:EGE基础入门篇(五):窗口简单操作 下一篇:EGE基础入门篇(七):组合图形 一.EGE提供的基本图形 EGE绘制图形相关库函数文档 https://xege.org ...

  6. EGE基础入门篇(七):组合图形

    EGE专栏:EGE专栏 上一篇:EGE基础入门篇(六):基本图形 下一篇:EGE基础入门篇(八):清屏与重绘 一. 组合图形 1. 复杂图形由基本图形组合而成   复杂的图形可以由基本图形组合而成,如 ...

  7. matplotlib中文文档_python绘图库——Matplotlib及Seaborn使用(入门篇1)

    在数据分析过程中,数据及模型可视化是无可避免的,同时这也是展示我们数据分析成果的最佳方式.因此,熟悉掌握绘图库的使用,对精进我们的数据分析技能起着不可替代的作用. 今天,我们就来了解一下python强 ...

  8. Opencv 入门篇学习记录(图片)

    title: Opencv 入门篇学习记录(图片) Opencv 入门篇学习记录(图片) 前言 很早以前就接触Python了,大学的时候还自学了一段时间去做了课设,写了一些最速梯度下降法.黄金分割法. ...

  9. Java学习笔记系列-入门篇-计算机基础

    Java学习笔记 Java学习笔记是一个持续更新的系列,工作多年,抽个空对自身知识做一个梳理和总结归纳,温故而知新,同时也希望能帮助到更多正在学习Java 的同学们. 本系列目录: 入门篇 计算机基础 ...

最新文章

  1. ASP.NET Core 2.2中的Endpoint路由
  2. 云知声联合亿咖通科技成立合资公司,布局汽车 AI 芯片
  3. php怎么随机显示6个数,PHP里一个12成员的数组,随机挑出6/3/3个成员(不重复),然后重新赋值,有什么简洁的办法实现?...
  4. H.265(HEVC)深度解析
  5. python 元组和字典的返回值后面有个L是什么意思
  6. post json后台处理数据_Python爬虫教程-07-post介绍(百度翻译)(上)
  7. 格“物”致知:多模态预训练再次入门
  8. 旋转链表Python解法
  9. 【Kattis - triangle 】Sierpiński Circumference(数学,求位数,取对数或Java)
  10. 字谜 java_java - 2字的字谜 - 堆栈内存溢出
  11. 鸿蒙系统 安卓游戏,华为鸿蒙系统运行安卓游戏出现新状况!安卓换皮论被彻底打脸?...
  12. php中global和$GLOBALS[]的分析之一
  13. 使用URLDecoder对URL进行中文解析
  14. css过度动画使用简介及animate.css库使用简介
  15. win10输入法简繁体切换及全角和半角切换快捷键
  16. 法语学习笔记——语音
  17. 【OpenCV】Flutter 上采用ffi 与 c++ 的opencv交互使用总结
  18. 堂堂985毕业就失业,我用3000块买大厂Offer
  19. Purdue, Mathematics Area Examination 学习笔记(1)
  20. 带你领略3D转换的魅力~

热门文章

  1. SRC挖掘-教育行业平台规则批量自动化
  2. Linux上创建vsftpd用户,linux vsftpd 创建虚拟用户
  3. 企业如何提升网站平台的安全防护?
  4. 浙江大学计算机学院教授情况,浙江大学计算机科学与技术学院导师介绍:张文宇...
  5. WorkNC3D沿面精加工技巧分享
  6. Android Activity跳转动画效果
  7. 苹果当前系统时间与服务器不一致,苹果iOS14时钟Bug与系统时间不同 比系统时间慢了3小时...
  8. 买家的诉求决定你的产品卖点
  9. Octaisobutyl POSS八异丁基笼状聚倍半硅氧烷/CAS号:221326-46-1/分子量:873.59/白色粉末状
  10. python打地鼠游戏教程_Python 0基础开发游戏:打地鼠(详细教程)VS code版本