graphics.h 是一个非常经典的、用于在 C 语言中进行图形编程的头文件,它由 Borland 公司在其 Turbo C/C++ 编译器中推广,因此也常被称为 Turbo C Graphics 或 BGI (Borland Graphics Interface)。

尽管它现在被认为是一个过时的库(主要用于教学和怀旧),但因其简单直观的 API,至今仍然是许多初学者学习图形编程的入门选择。
核心特点
- 简单易学:函数命名直观,如
circle()画圆,rectangle()画矩形。 - 底层控制:直接操作像素,提供了对图形模式、颜色、坐标系统等的底层控制。
- 平台依赖性强:它不是一个标准 C 库,而是特定于编译器的,它主要在 DOS 和 Windows 的旧版本(通过
winbgim等模拟)上工作,在现代的 Linux、macOS 或新版本的 Windows (如 VS Code, MinGW) 上,直接使用graphics.h会非常困难或不可能。 - 过时:在现代游戏开发、UI 设计等领域,它已被 OpenGL、DirectX、SDL、Qt、SFML 等更强大、更现代的库所取代。
如何使用 graphics.h (以 Windows + Dev-C++ 为例)
要在现代环境中使用,通常需要下载一个 graphics.h 的兼容库,winbgim,这里以一个常见的配置为例:
步骤 1:下载 winbgim.h 和 winbgim.lib
你需要从网上下载这两个文件,通常可以搜索 "BGI for Windows" 或 "Dev-C++ graphics.h" 找到资源。
步骤 2:配置 Dev-C++

- 将
winbgim.h文件放入 Dev-C++ 的include目录下。 - 将
winbgim.lib文件放入 Dev-C++ 的lib目录下。 - 在 Dev-C++ 的菜单栏选择
工具->编译选项->目录->C++包含文件,确保路径指向了你的include目录。 - 同样,在
链接器->库中,确保路径指向了你的lib目录,并且勾选了winbgim.lib。
步骤 3:编写代码
现在你就可以在你的 C 代码中包含 graphics.h 并开始编程了。
编程基本流程
使用 graphics.h 编写图形程序通常遵循以下固定步骤:
- 包含头文件:
#include <graphics.h> - 初始化图形模式:调用
initgraph()函数,从默认驱动程序和模式中初始化图形系统。 - 进行图形绘制:使用各种绘图函数(如
line,circle,rectangle等)在屏幕上画图。 - 关闭图形模式:程序结束时,调用
closegraph()函数,释放图形系统占用的资源,并返回到文本模式。
核心函数详解
1 初始化与关闭
-
void initgraph(int *driver, int *mode, char *path);-
作用:初始化图形系统。
(图片来源网络,侵删) -
参数:
driver: 指向图形驱动程序类型的指针,常用DETECT,它会自动检测硬件并使用最高分辨率的可用模式。mode: 指向图形模式的指针。driver是DETECT,此参数会被initgraph自动设置。path: 指向 BGI 文件(如*.BGI,*.CHR)所在路径的字符串,如果文件在程序当前目录,可以设为空字符串 。
-
示例:
#include <graphics.h> #include <conio.h> // 用于 getch() int main() { int gd = DETECT, gm; // gd = driver, gm = mode initgraph(&gd, &gm, ""); // 初始化图形模式 // ... 在这里画图 ... getch(); // 等待用户按键,防止窗口一闪而过 closegraph(); // 关闭图形模式 return 0; }
-
-
void closegraph();- 作用:关闭图形模式,释放所有内存,并恢复屏幕为调用
initgraph()之前的状态。 - 示例:见上面的
main函数。
- 作用:关闭图形模式,释放所有内存,并恢复屏幕为调用
2 绘图函数
-
设置颜色:
void setcolor(int color);设置后续绘图的颜色。void setbkcolor(int color);设置背景色。- 颜色可以使用预定义的常量,如
WHITE,BLACK,RED,GREEN,BLUE,YELLOW等。
-
画线:
void line(int x1, int y1, int x2, int y2);从(x1, y1)到(x2, y2)画一条直线。
-
画圆和椭圆:
void circle(int x, int y, int radius);以(x, y)为圆心,radius为半径画圆。void ellipse(int x, int y, int startangle, int endangle, int xradius, int yradius);画椭圆或圆弧。
-
画矩形和多边形:
void rectangle(int left, int top, int right, int bottom);画一个矩形框。void drawpoly(int numpoints, int *polypoints);画一个多边形。polypoints是一个包含所有顶点坐标的整数数组,格式为{x1, y1, x2, y2, ..., xn, yn}。numpoints是顶点的数量。
-
填充封闭区域:
void floodfill(int x, int y, int bordercolor);用当前填充颜色填充一个封闭区域。(x, y)是区域内的任意一点,bordercolor是区域的边界颜色。void setfillstyle(int pattern, int color);设置填充样式和颜色。pattern可以是SOLID(实心),LINE_FILL(直线),SLASH_FILL(斜线) 等。color是填充颜色。
3 坐标与文本
- 坐标系统:屏幕左上角是原点
(0, 0),x 轴向右为正,y 轴向下为正。 - 获取屏幕尺寸:
int getmaxx();返回 x 坐标的最大值。int getmaxy();返回 y 坐标的最大值。
- 输出文本:
void outtextxy(int x, int y, char *string);在指定坐标(x, y)处输出字符串。void settextstyle(int font, int direction, int size);设置文本字体、方向和大小。
完整示例代码
下面是一个完整的示例,它会初始化一个窗口,画一个填充的矩形,再画一个圆,并显示一行文字。
#include <graphics.h>
#include <conio.h> // 用于 getch()
int main() {
// 1. 初始化图形模式
// DETECT 表示自动检测驱动和模式
int gd = DETECT, gm;
initgraph(&gd, &gm, ""); // 假设 BGI 文件在当前目录
// 2. 进行图形绘制
// 设置背景色为浅灰色
setbkcolor(LIGHTGRAY);
cleardevice(); // 用背景色清屏
// 设置填充样式为绿色实心
setfillstyle(SOLID_FILL, GREEN);
// 画一个填充的矩形
rectangle(100, 100, 300, 250);
floodfill(150, 150, GREEN); // (150,150) 是矩形内部的一个点
// 设置线条颜色为红色
setcolor(RED);
// 画一个圆
circle(400, 200, 80);
// 设置文本颜色和样式
setcolor(BLUE);
settextstyle(DEFAULT_FONT, HORIZ_DIR, 2);
// 在屏幕上显示文字
outtextxy(200, 350, "Hello, Graphics World!");
// 3. 等待用户按键,防止窗口立即关闭
getch();
// 4. 关闭图形模式,返回到文本模式
closegraph();
return 0;
}
现代替代方案
虽然 graphics.h 很适合入门,但如果你要进行更严肃的图形编程,应该学习现代库:
| 库 | 特点 | 适用场景 |
|---|---|---|
| SDL (Simple DirectMedia Layer) | 跨平台,轻量级,提供 2D 图形、输入、音频、线程等功能,非常适合游戏开发和多媒体应用。 | 2D 游戏、模拟器、多媒体工具 |
| OpenGL | 一个强大的、跨平台的图形 API,专注于 3D 渲染,但也支持 2D,需要较高的学习曲线。 | 3D 游戏、科学可视化、CAD 软件 |
| SFML (Simple and Fast Multimedia Library) | C++ 风格的 SDL 替代品,面向对象,更易用。 | 2D/3D 游戏、多媒体应用 |
| Qt | 一个全面的 C++ 应用程序框架,包含强大的 GUI 模块。 | 桌面应用程序开发 |
| Raylib | 一个现代的、易于使用的 C 库,专注于游戏开发。 | 2D/3D 游戏、原型设计 |
graphics.h 是一个教学工具,而不是一个工业级的开发工具,它的价值在于:
- 简单直观:让你能快速理解图形编程的基本概念(像素、坐标、颜色、缓冲区)。
- 快速上手:几行代码就能画出图形,容易获得成就感。
- 历史意义:了解过去是如何进行图形编程的。
当你掌握了 graphics.h 的基本原理后,就应该转向更现代、更强大、更通用的图形库,如 SDL 或 OpenGL,以进行更深入的学习和实践。
