前言
绘制钟表作为编程项目,始终吸引着众多学习者的兴趣,它不仅是编程技能的一次实践,也是创意与美学融合的良好载体。随着科技的进步,传统钟表已逐步被电子钟表所取代,而电子钟表的设计更是趋向多元化,无论是追求视觉震撼的炫酷风格,还是崇尚简洁雅致的简约风格,都成为了现代设计的潮流。这些丰富多样的钟表样式,无一不依赖于编程技术的支持与创新,通过代码实现时间的精准展示与个性化呈现,让时间的流动更加生动有趣。因此,掌握钟表绘制的编程技能,不仅是对技术能力的锻炼,也是向美学与创意领域迈进的重要一步。
如果你想给自己设计一款钟表样式,你会设计成什么样子呢?在前面的文章中我发表过一个很炫酷的钟表样式,如下所示:
简约
在当下,简约风格备受推崇,它倡导以最少的色彩、最精炼的要素,营造出清新、宁静的视觉体验。今天,我们将运用C语言这一强大的编程语言,来绘制一款简约风格的钟表。这款钟表将遵循“少即是多”的设计理念,通过精准的代码实现时间的展示,同时保持界面的简洁与雅致,让时间的流转在简洁的线条与数字间优雅呈现。
源码
///////////////////////////////////////////////////
// 程序名称:绘制钟表
// 编译环境:Mictosoft Visual Studio 2022, EasyX_20200315(beta)
// 作 者:luoyh <2864292458@qq.com>
// 公 众 号:C语言研究
// 最后修改:2024-9-24
//
void DralDial();
void DrawHand(int hour, int minute, int second);
void digital(int h, int m, int s);
int main(void)
{
initgraph(500, 500);
setbkcolor(BLACK);
cleardevice();
SYSTEMTIME t; //定义变量保存当前时间
setbkmode(TRANSPARENT);
BeginBatchDraw();
while (!_kbhit())
{
GetLocalTime(&t); //获取当前时间
DralDial(); //画表盘
DrawHand(t.wHour, t.wMinute, t.wSecond); //画表针
//digital(t.wHour, t.wMinute, t.wSecond); // 显示时间
FlushBatchDraw();
Beep(8000, 50);
Sleep(1000);
cleardevice();
}
EndBatchDraw();
closegraph();
return 0;
}
/*画表盘*/
void DralDial()
{
int x1, y1, x2, y2;
setlinecolor(RGB(100, 100, 100));
setlinestyle(PS_SOLID | PS_ENDCAP_SQUARE, 1);
for (int i = 0; i <= 59; i++)
{
// 画60条短线
x1 = (int)(250 + (sin(i * PI / 30) * 205));
y1 = (int)(250 - (cos(i * PI / 30) * 205));
x2 = (int)(250 + (sin(i * PI / 30) * 215));
y2 = (int)(250 - (cos(i * PI / 30) * 215));
if (i % 5)
{
line(x1, y1, x2, y2);
}
}
settextcolor(WHITE);
//写表盘数字
for (int n = 0; n < 12; n++)
{
wchar_t s[10];
swprintf_s(s, 10, L"%d", 12 - n); // int 类型转换成 char 类型
settextstyle(80, 0, _T("微软雅黑"));
// 定义字符串长和宽,居中
int w, h;
w = textwidth(s);
h = textheight(s);
outtextxy(int(160 * cos(n * 2 * PI / 12 + PI / 2) - w / 2) + 250,
-int(160 * sin(n * 2 * PI / 12 + PI / 2) + h / 2) + 250, s);
}
for (int n = 0; n < 12; n++)
{
wchar_t s[10];
swprintf_s(s, 10, L"%02d", (12 - n) * 5); // int 类型转换成 char 类型
settextstyle(25, 0, _T("微软雅黑"));
// 定义字符串长和宽,居中
int w, h;
w = textwidth(s);
h = textheight(s);
outtextxy(int(210 * cos(n * 2 * PI / 12 + PI / 2) - w / 2) + 250,
-int(210 * sin(n * 2 * PI / 12 + PI / 2) + h / 2) + 250, s);
}
}
//画指针
void DrawHand(int hour, int minute, int second)
{
int xhour, yhour, xminute, yminute, xsecond, ysecond; //表心坐标系指针坐标
xhour = (int)(110 * sin(hour * PI / 6 + minute * PI / 360 + second * PI / 1800));
yhour = (int)(110 * cos(hour * PI / 6 + minute * PI / 360 + second * PI / 1800));
xminute = (int)(200 * sin(minute * PI / 30 + second * PI / 1800));
yminute = (int)(200 * cos(minute * PI / 30 + second * PI / 1800));
xsecond = (int)(215 * sin(second * PI / 30));
ysecond = (int)(215 * cos(second * PI / 30));
//画时针
setlinecolor(WHITE);
setlinestyle(PS_SOLID, 6);
line(250 + xhour, 250 - yhour, 250, 250);
setlinestyle(PS_SOLID, 14);
line(250 + xhour, 250 - yhour, 250 + xhour / 3, 250 - yhour / 3);
//画分针
setlinestyle(PS_SOLID, 6);
line(250 + xminute, 250 - yminute, 250, 250);
setlinestyle(PS_SOLID, 14);
line(250 + xminute, 250 - yminute, 250 + xminute / 5, 250 - yminute / 5);
//画秒针
setfillcolor(WHITE);
solidcircle(250, 250, 8);
setlinecolor(RGB(190, 151, 118));
setlinestyle(PS_SOLID, 3);
circle(250, 250, 5);
line(250 + xsecond, 250 - ysecond, 250 - xsecond / 5, 250 + ysecond / 5);
setfillcolor(RGB(35, 0, 0));
solidcircle(250, 250, 3);
}
// 显示数字时钟
void digital(int h, int m, int s)
{
// 画显示当前时间的三个小矩形
setlinecolor(LIGHTGRAY); // 设置边框颜色为浅灰色
setfillcolor(WHITE); // 设置填充颜色为白色
fillrectangle(250 - 40 - 13, 300, 250 - 40 + 13, 300 + 26);
fillrectangle(250 - 13, 300, 250 + 13, 300 + 26);
fillrectangle(250 + 40 - 13, 300, 290 + 13, 300 + 26);
// 显示当前时间
settextstyle(24, 0, _T("微软雅黑"));
wchar_t a[10];
int w;
settextcolor(BLACK);
swprintf_s(a, 10, L"%02d", h); w = textwidth(a); outtextxy(250 - 40 - w / 2, 300, a);
swprintf_s(a, 10, L"%02d", m); w = textwidth(a); outtextxy(250 - w / 2, 300, a);
swprintf_s(a, 10, L"%02d", s); w = textwidth(a); outtextxy(250 + 40 - w / 2, 300, a);
}