1、下载安装 WinBGIm 库
WinBGIm(Windows Borland Graphics Interface Library for MinGW)库是一个用于在 Windows 上运行 BGI(Borland Graphics Interface)程序的图形库。它是为 MinGW 编译器设计的,但也兼容其他一些编译器。WinBGIm 是 Borland C++ 的 BGI 图形库的一个移植版本,允许在现代 Windows 环境中使用传统的 BGI 图形功能。
下载地址:
https://winbgim.codecutter.org/
https://github.com/ahmedshakill/WinBGIm-64/releases/tag/v1.0.1
下载的压缩包中提取文件。可以获得多个文件,包括 graphics.h
、winbgim.h
和 libbgi.a
。
2、配置 Code::Blocks
1)复制头文件和库文件
将 graphics.h 和 winbgim.h 复制到 Code::Blocks 的 include 目录中,通常位于:
C:\Program Files (x86)\CodeBlocks\MinGW\include
将 libbgi.a
复制到 Code::Blocks 的 lib
目录中,通常位于:
C:\Program Files (x86)\CodeBlocks\MinGW\lib
2)配置编译器和链接器
打开 Code::Blocks。创建一个新的控制台应用程序项目。在项目中,右键点击项目名称,选择 Build options。在 Linker settings 选项卡中,点击 Add 按钮,并添加 libbgi.a
。
在 Other linker options 中,添加以下内容:
-lbgi -lgdi32 -lcomdlg32 -luuid -loleaut32 -lole32
3、项目代码
用于绘制圆盘时钟的完整代码,如下,
#include <graphics.h>
#include <math.h>
#include <time.h>
#include <stdio.h>
#define PI 3.14159
void drawClockFace(int xCenter, int yCenter, int radius) {
// 画圆
circle(xCenter, yCenter, radius);
// 画小时刻度
for (int i = 0; i < 12; i++) {
int angle = i * 30; // 360 / 12 = 每小时30度
int xOuter = xCenter + (radius - 10) * cos(angle * PI / 180);
int yOuter = yCenter + (radius - 10) * sin(angle * PI / 180);
int xInner = xCenter + (radius - 20) * cos(angle * PI / 180);
int yInner = yCenter + (radius - 20) * sin(angle * PI / 180);
line(xOuter, yOuter, xInner, yInner);
}
}
void drawHand(int xCenter, int yCenter, int length, double angle) {
int x = xCenter + length * cos(angle);
int y = yCenter + length * sin(angle);
line(xCenter, yCenter, x, y);
}
void updateClock(int xCenter, int yCenter, int radius) {
time_t rawtime;
struct tm *timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
int hours = timeinfo->tm_hour % 12;
int minutes = timeinfo->tm_min;
int seconds = timeinfo->tm_sec;
// 将当前时间转换为角度
double hourAngle = (hours + minutes / 60.0) * 30 * PI / 180 - PI / 2;
double minuteAngle = (minutes + seconds / 60.0) * 6 * PI / 180 - PI / 2;
double secondAngle = seconds * 6 * PI / 180 - PI / 2;
// 画时钟指针
setcolor(WHITE);
drawHand(xCenter, yCenter, radius - 50, hourAngle);
drawHand(xCenter, yCenter, radius - 20, minuteAngle);
setcolor(RED);
drawHand(xCenter, yCenter, radius - 10, secondAngle);
}
int main() {
int gd = DETECT, gm;
initgraph(&gd, &gm, "");
int xCenter = getmaxx() / 2;
int yCenter = getmaxy() / 2;
int radius = 200;
while (!kbhit()) {
cleardevice();
drawClockFace(xCenter, yCenter, radius);
updateClock(xCenter, yCenter, radius);
delay(1000);
}
closegraph();
return 0;
}
效果如下: