EGE_动态时钟屏保

编写时环境: VS2010,ege15.04
以下是源代码,临时兴起所写,有些小BUG,作为示例项目使用,目前还没有添加退出,请自行任务栏关闭程序

#include <graphics.h>
#include <Windows.h>
#include <math.h>
#include <time.h>

#define PI 3.1416

typedef struct PROP
{
	//圆心
	ege_point round;
	//屏幕分辨率
	ege_point scr;
	//各个刻度半径
	float radiusH;
	float radiusM;
	float radiusS;
	//刻度线长度
	float caliLeng;
	//刻度坐标
	ege_point pHStart[360];
	ege_point pHEnd[360];
	ege_point pMStart[360];
	ege_point pMEnd[360];
	ege_point pSStart[360];
	ege_point pSEnd[360];

	struct tm *pTime;
	float ms;

	PIMAGE img[60];
}PROP;

PROP prop;

static inline int  GetScrX(){return GetSystemMetrics(SM_CXSCREEN);}
static inline int  GetScrY(){return GetSystemMetrics(SM_CYSCREEN);}

//初始化界面上线条数据
void Init()
{
	//设置分辨率
	prop.scr.x = GetScrX();
	prop.scr.y = GetScrY();
	//设置圆心
	prop.round.y = prop.scr.y / 2.0;
	prop.round.x = prop.scr.x / 2.0;
	//设置各个刻度半径
	prop.radiusS = prop.scr.y / 2.0 - prop.scr.y / 20.0;
	prop.radiusM = prop.scr.y / 2.0 - prop.scr.y / 10.0;
	prop.radiusH = prop.scr.y / 2.0 - (prop.scr.y / 20.0) * 3;
	//设置刻度线长度
	prop.caliLeng = prop.scr.y / 20.0;
	//设置刻度坐标
	for (float r = 0.0;r < 360.0 ; r = r + 1.0)
	{
		//计算秒针
		prop.pSStart[int(r)].x = prop.round.x + prop.radiusS * cos(r * 1.0 * PI / 180.0);
		prop.pSStart[int(r)].y = prop.round.y + prop.radiusS * sin(r * 1.0 * PI / 180.0);
		prop.pSEnd[int(r)].x = prop.round.x + (prop.radiusS - prop.scr.y / 40.0)  * cos(r * 1.0 * PI / 180.0);
		prop.pSEnd[int(r)].y = prop.round.y + (prop.radiusS - prop.scr.y / 40.0) * sin(r * 1.0 * PI / 180.0);
		//计算分针
		prop.pMStart[int(r)].x = prop.round.x + prop.radiusM * cos(r * 1.0 * PI / 180.0);
		prop.pMStart[int(r)].y = prop.round.y + prop.radiusM * sin(r * 1.0 * PI / 180.0);
		prop.pMEnd[int(r)].x = prop.round.x + (prop.radiusM - prop.scr.y / 40.0)  * cos(r * 1.0 * PI / 180.0);
		prop.pMEnd[int(r)].y = prop.round.y + (prop.radiusM - prop.scr.y / 40.0) * sin(r * 1.0 * PI / 180.0);
		
		//计算时针
		prop.pHStart[int(r)].x = prop.round.x + prop.radiusH * cos(r * 1.0 * PI / 180.0);
		prop.pHStart[int(r)].y = prop.round.y + prop.radiusH * sin(r * 1.0 * PI / 180.0);
		prop.pHEnd[int(r)].x = prop.round.x + (prop.radiusH - prop.scr.y / 40.0)  * cos(r * 1.0 * PI / 180.0);
		prop.pHEnd[int(r)].y = prop.round.y + (prop.radiusH - prop.scr.y / 40.0) * sin(r * 1.0 * PI / 180.0);
	}
}
//初始化文字图片
void InitNumber()
{
	setfont(prop.scr.y / 50.0,0,"宋体");
	for (int i = 0 ; i < 60 ; i++)
	{
		xyprintf(prop.scr.y / 50.0, prop.scr.y / 50.0,"%d",i);
		prop.img[i] = newimage();
		getimage(prop.img[i],prop.scr.y / 50.0,prop.scr.y / 50.0,
				prop.scr.y / 50.0,prop.scr.y / 50.0);
		cleardevice();
		//putimage_rotate(NULL,prop.img[i],20 * i,100,0.5f,0.5f,i / 60.0 * (float)i,0,255,0);
		//delay_ms(1000);
	}
}
//获取本地时间
void GetLocalTime()
{
	time_t timep;
	time(&timep);
	prop.pTime = localtime(&timep);

}
void GetMs()
{
	DWORD pt = GetTickCount();
	prop.ms = ((float)(pt % 1000)) / 1000.0;
}
//绘制秒 刻度
void DrawSecLine(float sec)
{
	for (int i = 359 ; i >= 0; i --)
	{
		if ((i + 360 - ((int)(sec * 6.0))) % 6 == 0)
		{
			ege_line(prop.pSStart[i].x, prop.pSStart[i].y, prop.pSEnd[i].x, prop.pSEnd[i].y);
			putimage_rotate(NULL,prop.img[((i/6)+ 15 - (int)(sec) + 60)%60],
				prop.pSEnd[i].x, prop.pSEnd[i].y,0.5f,0.5f,
				(((float)-i) + 270.0) * PI / 180.0,
				0,255,0);
		}
	}
}
//绘制分 刻度
void DrawMinLine(float min)
{
	for (int i = 0 ; i < 360; i ++)
	{
		if ((i + 360 - ((int)(min * 6.0))) % 6 == 0)
		{
			ege_line(prop.pMStart[i].x, prop.pMStart[i].y, prop.pMEnd[i].x, prop.pMEnd[i].y);
			putimage_rotate(NULL,prop.img[((i/6)+ 15 - (int)(min) + 60)%60],
				prop.pMEnd[i].x, prop.pMEnd[i].y,0.5f,0.5f,
				(((float)-i) + 270.0) * PI / 180.0,
				0,255,0);
		}
	}
}
//绘制时 刻度
void DrawHourLine(float hour)
{
	for (int i = 0 ; i < 360; i ++)
	{
		if ((i + 360 - ((int)(hour * 6.0))) % 30 == 0)
		{
			ege_line(prop.pHStart[i].x, prop.pHStart[i].y, prop.pHEnd[i].x, prop.pHEnd[i].y);
			int j = (((i/6)+ 15 - (int)(hour) + 60)%60)/ 5;
			putimage_rotate(NULL,prop.img[j?j:12],
				prop.pHEnd[i].x, prop.pHEnd[i].y,0.5f,0.5f,
				(((float)-i) + 270.0) * PI / 180.0,
				0,255,0);
		}
	}
}
//绘制指针
void DrawPoint()
{
	setfillcolor(EGEACOLOR(0xF0, RED));
	ege_point ep[3] = {
		{
			prop.round.x-5,prop.round.y
		},
		{
			prop.round.x+5,prop.round.y
		},
		{
			prop.round.x,prop.round.y - prop.scr.y / 3
		}
	};
	ege_fillpoly(3,ep);
	//ege_line(prop.round.x,prop.round.y,prop.round.x,prop.round.y - prop.scr.y / 3);
}
int main(void)
{
	setinitmode(INIT_NOBORDER);
	initgraph(-1,-1);
	setcolor(EGEACOLOR(0xF0, GREEN));
	//设置抗锯齿
	ege_enable_aa(true);
	//初始化数据
	Init();
	//初始化图片
	InitNumber();
	while (true)
	{
			GetMs();
			GetLocalTime();
			DrawSecLine(60.0 - float(prop.pTime->tm_sec) - prop.ms);
			DrawMinLine(60.0 - float(prop.pTime->tm_min) - float(prop.pTime->tm_sec / 60.0));
			DrawHourLine(60.0 - (prop.pTime->tm_hour % 12 + prop.pTime->tm_min / 60.0) * 5);
			DrawPoint();
			
			
			xyprintf(0,240,"毫秒:%.3f",prop.ms);
			xyprintf(0,200,"%d年%d月%d时 星期%d %d时%d分%d秒",
				prop.pTime->tm_year + 1900,
				prop.pTime->tm_mon + 1,
				prop.pTime->tm_mday,
				prop.pTime->tm_wday,
				prop.pTime->tm_hour,
				prop.pTime->tm_min,
				prop.pTime->tm_sec
				);
			delay_fps(10);
			cleardevice();
	}
}