?? 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 + -