⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 source.cpp

📁 一个在电脑上运行的时钟
💻 CPP
字号:
/**
*	Title	CLOCK.cpp
*
*  	Created on 2009-3-30
*      	@Author ShaunChxion
*			@Email shaunchyxion@163.com
*				@Shaun All Rights reserved.
*
*/
/****************************************************
	    			ClocMainFction.cpp
-----------------------------------
[文件]
					(i)		Clock.cpp		主程序
				   	(ii)		winbgi.cpp
				  	(iii)	source.cpp
				  	(iv) 	graphics.h
				  	(v)		Clock.h
					(vi)		figure.cpp
					(vii)	figure.h

****************************************************************/



#include <cmath>
#include <ctime>

#include <cstdlib>
#include "graphics.h"
#include "Clock.h"
#include "figure.h"

extern int clickOp;

//白加黑
void whiteAndBlack(void)
{
	
	//外圆半径
	int R = radius + wide;
	setcolor(DARKGRAY);
	setlinestyle(0,0,2);			//设置线条格式为2个像素
	circle(centrex, centrey, R);	//画外圈大圆
	//绘制中间2条直线
	line(centrex, centrey-R, centrex, centrey+R);	
	line(centrex-R, centrey, centrex+R, centrey);
	//填充对角2个区域
	setfillstyle(SOLID_FILL, DARKGRAY);
	floodfill(centrex-3, centrey+3, DARKGRAY);
	floodfill(centrex+3, centrey-3, DARKGRAY);
	
	setfillstyle(SOLID_FILL, MAGENT);
	floodfill(centrex-3, centrey-3, DARKGRAY);
	floodfill(centrex+3, centrey+3, DARKGRAY);

	//添加表盘
	drawDial(LIGHTCYAN);
}

//完美石刻
void stone(void)
{
	//绘制钟座
	//突起条形图
	upbar(OX, OY, OX+sideLength, OY+sideLength);
	dnbar(OX+wide, OY+wide, OX+sideLength-wide, OY+sideLength-wide);
	//设置线条格式
	setlinestyle(0,0,0);
	setcolor(DARKGRAY);
	//上下2个矩形
	rectangle(OX+wide, OY+2, OX+sideLength-wide, OY+wide/2);
	rectangle(OX+wide, OY+sideLength-wide/2, OX+sideLength-wide, OY+sideLength);
	settextstyle(3,0,3);
	outtextxy(OX+wide+115, OY+sideLength-wide+10,"完美石刻");
	//不规则线条的活动范围
	int d1 = wide / 2;
	int d2 = 10;
	//画左边不规则线条
	int x1 = OX + abs(rand() % d1), x2 = OX + (rand() % d1);
	int y1 = OY, y2 = OY + (rand() % d2);
	line(x1, y1, x2, y2);
	for (int i=1; i<45; i++)
	{
		x1 = x2; 
		x2 = OX + abs(rand() % d1); 
		y1 = y2;
		y2 = OY + i * d2 + abs(rand() % d2);
		line(x1, y1, x2, y2);
		delay(10);
	}
	//画最后一根线,连接到底部
	x1 = x2;
	y1 = y2;
	x2 = OX + wide;
	y2 = OY + sideLength;
	line(x1, y1, x2, y2);	//连接到底部
	
	//绘制右边不规则线条
	srand(time(NULL));	//初始化随机数
	x1 = OX + sideLength - abs(rand() % d1), x2 = OX + sideLength - (rand() % d1);
	y1 = OY , y2 = OY + (rand() % d2);
	line(x1, y1, x2, y2);
	for (int i=1; i<45; i++)
	{

		x1 = x2; 
		x2 = OX + sideLength - abs(rand() % d1); 
		
		y1 = y2;
		y2 = OY + i * d2 + abs(rand() % d2);
		
		line(x1, y1, x2, y2);
		delay(10);
	}
	//画最后一根线,连接到底部
	x1 = x2;
	y1 = y2;
	x2 = OX + sideLength-wide;
	y2 = OY + sideLength;
	line(x1, y1, x2, y2);	//连接到底部
	
	//添加表盘
	drawDial(LIGHTGRAY);
	
}


//五星斑点
void stars(void)
{
	//衬底
	setcolor(WHITE);
	bar(OX, OY-30, OX+sideLength+30,OY+sideLength);
	int size = 10;
	int x;
	int y;
	/**
	*	@设计思路:
	*	(i)用随机的半径,一定范围内的圆心,
	*	 随机的颜色绘制一片填充圆
	*	(ii)绘制外圈的椭圆及其一个包围整个
	*	 面积的矩形,填充相间部分
	*	(iii)得到一个椭圆包围的随机图案,
	*	添加表盘
	*/
	setcolor(DARKGRAY);
	srand(time(NULL));
	for (int i=OY; i<OY+sideLength; i+=2*size)
	{
	
		for (int j=OX; j<OX+sideLength; j+=2*size)
		{
			x = j + size + rand() % (size/4);
			y = i + rand() % (size/4);
			int r = (rand()%size);
			//填充颜色为随机16种
			int color = abs(rand()%16);	
			setfillstyle(SOLID_FILL, color);
			fillellipse(x, y, r, r);
		}
	}
	//绘制外圈椭圆
	setcolor(LIGHTGRAY);
	ellipse(centrex, centrey, 0, 360,sideLength/2-1, 3*sideLength/8);
	//绘制大矩形圈掉随机产生的图案,
	rectangle(OX, OY-30, OX+sideLength+30, OY+sideLength);
	setfillstyle(SOLID_FILL, LIGHTGRAY);
	floodfill(OX+3, OY+3, LIGHTGRAY);
	//为外圈椭圆描黑色边
	setlinestyle(2,7,3);
	setcolor(DARKGRAY);
	ellipse(centrex, centrey, 0, 360,sideLength/2-2, 3*sideLength/8-1);
	
	drawDial(CYAN);
	setbkcolor(WHITE);
	setcolor(BLUE);
	settextstyle(4,0,1);
	outtextxy(centrex-50,centrey+radius+5,"五星斑点");
}

//绘制表盘
void drawDial(int bkcolor)
{
	//先弄点垫底的,为了不和背景色相同造成填充不成功,
	setfillstyle(SOLID_FILL, WHITE);
	fillellipse(centrex, centrey, radius, radius);
	
	//绘制表盘
	//一个突起圆块
	//背景色可以自定义
	setlinestyle(2,5,3);
	upCircleFill(centrex, centrey, radius, bkcolor);
	//绘制盘符
	setcolor(DARKGRAY);
	setlinestyle(0,0,1);
	/**
	*	绘制分秒刻度
	*	初始角度, 默认平行于12点方向
	*	每个刻度相差6度
	*/
	for (int angle = 0;angle<360; angle+=6)	
	{
		//将angle转换为弧度制
		int  x = centrex + (radius-45) * sin(angle*pi/180);
		int  y = centrey - (radius-45) * cos(angle*pi/180);
		line(centrex, centrey, x, y);
	}
	//绘制填充圆形覆盖中间的线条
	//只留下边缘的刻度符
	setcolor(LIGHTGRAY);	
	fillellipse(centrex, centrey, radius-55, radius-55);
		
	/**
	*	绘制时刻度
	*	初始角度, 默认平行于12点方向
	*	每个刻度相差30度
	*/
	setcolor(DARKGRAY);
	setlinestyle(0,0,3);
	for(int angle = 0; angle<360; angle+=30)
	{		
		//将angle转换为弧度制
		int  x = centrex + (radius-45) * sin(angle*pi/180);
		int  y = centrey - (radius-45) * cos(angle*pi/180);
		line(centrex, centrey, x, y);
	}	
	setcolor(LIGHTGRAY);	
	fillellipse(centrex, centrey, radius-65, radius-65);
	
	//绘制表盘字符
	char symbol[][4] = {"XII","III","VI","IX",};
	settextstyle(6,0,1);
	setcolor(BROWN);
	setbkcolor(bkcolor);
	for(int angle = 0; angle<360; angle+=90)
	{		
		//将angle转换为弧度制
		int i = angle/90;
		int  x = centrex + (radius-25) * sin(angle*pi/180);
		int  y = centrey - (radius-25) * cos(angle*pi/180);
		outtextxy(x-15,y-10,symbol[i++]);
	}
}




//版面信息
void outInfo(void)
{
	//工作人员
	setbkcolor(LIGHTGRAY);
	setcolor(YELLOW);
	settextstyle(4,0,3);
	outtextxy(centrex-sideLength/2,centrey+sideLength/2+15,"@Designed By Huang Yong");
	setcolor(MAGENT);
	settextstyle(8,0,4);
	outtextxy(centrex-sideLength/2,centrey+sideLength/2+45,"$Shaun Works");
	

	upbar(OX+sideLength+40, OY-5, OX+sideLength+155, OY+30);
	setcolor(BLUE);
	settextstyle(9,0,3);
	outtextxy(OX+sideLength+43, OY,"Opinios");
	
	
	setcolor(MAGENT);
	setlinestyle(2, 0, 1);


	
	
}

void displayMenu(void)
{
	//鼠标点击opinions后
	//造成凹陷效果
	dnbar(OX+sideLength+40, OY-5, OX+sideLength+155, OY+30);
	//虚线框表示点击成功
	setcolor(CYAN);
	setlinestyle(2, 0, 1);
	rectangle(OX+sideLength+45, OY, OX+sideLength+150, OY+25);
	
	
	//选项框左上角顶点
	int x = OX+sideLength+50;
	int y = OY+35;
	/**
	*	@总选项框.
	*	由于颜色的互相影响,
	*	所以的绘制选项框之间都先做衬底,
	*	以清除上次遗留
	*/
	setcolor(LIGHTGRAY);		
	bar(x, y, x+150, y+245);	//衬底
	upbar(x, y, x+150, y+245);
	
	//绘制分叉选项框
	char opinions[10][16] = {
		
			"完美石刻",
			"白加黑",
			"五星斑点",
			"关于",
			"退出",
			"等待增加",
			"..."
	};
	
	for (int i=0; i<8; i++)
	{
		upbar(x+2, y+30*i+2, x+148, y+30*(i+1));
		setbkcolor(LIGHTGRAY);
		setcolor(DARKGRAY);
		settextstyle(4,0,1);
		outtextxy(x+5, y+30*i+5,opinions[i]);
	}

}
//点击opinions
bool clickOpinions(int mouse_x, int mouse_y)
{
	//点击坐标在Opinions选项框内
	return (mouse_x > OX+sideLength+40 && mouse_y > OY-5 &&
			mouse_x < OX+sideLength+155 && mouse_y < OY+30);
}

//点击菜单选项
bool clickBranch(int mouse_x, int mouse_y)
{	
	//总菜单的左上角坐标
	int x1 = OX + sideLength +50;
	int y1 = OY + 35;
	//菜单右下角坐标
	int x2 = x1 + 150;
	int y2 = y1 + 350;
	
	//点击坐标在菜单选项内
	return (mouse_x > x1 && mouse_x < x2 &&
			mouse_y > y1 && mouse_y < y2);
}

//点击分选项后造成的效果
//传入参数为从上至下的选项标号
void clickResult(int grade)
{
	//选项框左上角顶点
	int x = OX+sideLength+50;
	int y = OY+35;
	
	//凹陷并虚线框点击的选项
	dnbar(x+2, y+30*grade+2, x+148, y+30*(grade+1));
	setcolor(MAGENT);
	setlinestyle(2, 0, 1);	//设置线条为虚线格式
	rectangle(x+6, y+grade*30+8, x+144, y+30*(grade+1)-5);
	
	//选项产生的结果
	switch (grade)
	{
	//更换皮肤
	case 0:
		clearTable();//先清除上一个皮肤
		stone();	//完美石刻
		break;
		
	case 1:
		clearTable();
		whiteAndBlack();
		break;
		
	case 2:
		clearTable();
		stars();
		break;
	//关于信息	
	case 3:
		setcolor(BROWN);
		settextstyle(2,0,5);
		outtextxy(OX+sideLength+50, OY+285,
				"由于时钟自动获得");
		outtextxy(OX+sideLength+50, OY+305,
				"系统时间,所以你可");
		outtextxy(OX+sideLength+50, OY+325,
				"以不用修改时间,如");
		outtextxy(OX+sideLength+50, OY+345,
				"果你坚持,请自行修");
		outtextxy(OX+sideLength+50, OY+365,
				"改系统时间.");
		
		setcolor(RED);
		settextstyle(5,0,1);				
		outtextxy(OX+sideLength+50, OY+385,
				"Chyxion.2009.04");
		outtextxy(OX+sideLength+50, OY+405,
				"AllRightReserved");
		break;
	//退出
	case 4:
		setcolor(LIGHTGRAY);		
		bar(x-10, y, x+175, y+455);	//清除菜单及其关于信息
		//恢复opinions
		bar(OX+sideLength+40, OY-5,
		    OX+sideLength+155, OY+30);
		upbar(OX+sideLength+40, OY-5,//弹起opinions
		      OX+sideLength+155, OY+30);
		setcolor(BLUE);
		settextstyle(9,0,3);
		outtextxy(OX+sideLength+43, OY,
				 "Opinios");
				 
		clickOp = FALSE;		//消除点击记录
		break;
	}	
}

//刷新桌面
void clearTable(void)
{
	setcolor(LIGHTGRAY);		
	bar(OX, OY, OX+sideLength+1, OY+sideLength+1);
}

//刷新表盘
void clearDial()
{	
	setcolor(LIGHTGRAY);
	setfillstyle(SOLID_FILL, LIGHTGRAY);
	fillellipse(centrex, centrey, 
	            second_radius+1,
			   second_radius+1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -