C++图形时钟(画图入门篇)

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;
}

你可能感兴趣的:(C语言,c++,C语言,图形时钟,C++图形时钟,ACLIB)