📄 source.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 + -