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
#include
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();
//时间增1
void AddOneS();
//获取形状,注意:时钟生成后,不能修改形状,所以没有设置形状的函数
SHAPE GetShape();
void DispTime(); //显示时间
void DrawMyClockWithShape(int x,int y,int w,int h);//画时钟
};
clock.c
#include
#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);//把时间给tmm
h=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<<"时区:"<=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
下面就是主函数了
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
#include
#include
#include
#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; //生成圆形时钟c1
c2 = new Clock(rectangleShape);//生成矩形时钟c2
srand((unsigned)time(NULL));
s = rand() % 2; //根据时间生成随机数
startTimer(0,1000); //设置定时器 一秒
return 0;
}