什么是 graphics.h?
graphics.h 是一个非标准的 C 语言头文件,由 Borland 公司在其著名的 Turbo C/C++ 编译器中提供,它提供了一系列简单易用的函数,允许程序员在 DOS 环境下直接操作图形模式,绘制点、线、圆、矩形等基本图形,并处理图像和颜色。

(图片来源网络,侵删)
核心特点:
- 简单易用:API 设计直观,函数名如
circle(),line(),rectangle()等一看就懂。 - 功能有限:主要支持 2D 图形,功能远不如现代图形库(如 OpenGL, DirectX, SDL)强大。
- 平台依赖性强:它是为特定的 DOS 环境和硬件(VGA, EGA 卡)设计的,无法在现代的 Windows、Linux 或 macOS 上直接编译运行。
- 历史意义:它是无数程序员(尤其是在中国和印度)接触计算机图形学的“启蒙老师”,在 90 年代到 21 世纪初非常流行。
如何使用 graphics.h(以 Turbo C 为例)`
使用 graphics.h 的基本流程非常固定,通常遵循以下五个步骤:
步骤 1: 包含头文件
#include <graphics.h> // 包含图形库头文件 #include <conio.h> // 用于 getch() 等控制台函数 #include <stdlib.h> // 用于 exit() 函数
步骤 2: 初始化图形驱动
在使用任何图形函数之前,必须先将屏幕从文本模式切换到图形模式,这通过 initgraph() 函数完成。
initgraph() 函数原型:

(图片来源网络,侵删)
void initgraph(int *driver, int *mode, char *path);
driver: 指向图形驱动程序类型的指针,常用DETECT,它会自动检测你的硬件并使用最高级的可用模式。mode: 指向图形模式的指针。driver设置为DETECT,mode会被自动设置为检测到的模式。path: 图形驱动程序文件(.BGI)所在的路径,如果放在当前目录下,可以设置为空字符串 。
示例代码:
int gd = DETECT, gm; // gd = Graph Driver, gm = Graph Mode initgraph(&gd, &gm, ""); // 自动检测并初始化图形模式
步骤 3: 使用图形函数进行绘制
初始化成功后,你就可以调用各种绘图函数了。
常用绘图函数:
void putpixel(int x, int y, int color);// 在指定位置画一个点void line(int x1, int y1, int x2, int y2);// 画一条直线void circle(int x, int y, int radius);// 画一个圆void rectangle(int left, int top, int right, int bottom);// 画一个矩形void outtextxy(int x, int y, char *string);// 在指定位置输出文本
颜色相关:
int getcolor();// 获取当前绘图颜色void setcolor(int color);// 设置当前绘图颜色void setfillstyle(int pattern, int color);// 设置填充模式和颜色void floodfill(int x, int y, int bordercolor);// 填充一个封闭区域
示例代码:
// 设置绘图颜色为红色 setcolor(RED); // 画一个圆 circle(320, 240, 100); // 设置填充样式为黄色实心 setfillstyle(SOLID_FILL, YELLOW); // 填充圆的内部 floodfill(320, 240, RED); // 在圆心位置输出文字 outtextxy(300, 240, "Hello, Graphics!");
步骤 4: 关闭图形模式
程序结束前,需要关闭图形模式,返回到文本模式,以便在控制台看到最终结果或进行其他操作。
closegraph() 函数用于此目的。
示例代码:
closegraph(); // 关闭图形模式,返回文本模式
步骤 5: 完整示例代码
下面是一个完整的示例,它将绘制一个红色的圆,并填充黄色。
#include <graphics.h>
#include <conio.h>
int main() {
// 1. 初始化图形模式
int gd = DETECT, gm;
initgraph(&gd, &gm, ""); // 自动检测硬件并初始化
// 2. 绘制图形
// 设置圆的边框颜色为红色
setcolor(RED);
// 画一个圆,圆心(320, 240),半径100
circle(320, 240, 100);
// 设置填充模式为黄色实心
setfillstyle(SOLID_FILL, YELLOW);
// 填充圆的内部 (从圆心(320, 240)开始填充,边界颜色为红色)
floodfill(320, 240, RED);
// 在圆心位置输出文字
outtextxy(300, 240, "Hello, Graphics!");
// 3. 等待用户按键
getch(); // 暂停程序,等待用户按任意键
// 4. 关闭图形模式
closegraph();
return 0;
}
如何编译和运行:
- 你需要一个 Turbo C/C++ 编译器(
tc.exe)。 - 将代码保存为
.c文件(draw.c)。 - 在 Turbo C 中打开该文件,按
F9编译,然后按Ctrl+F9运行。 - 程序会弹出一个图形窗口,显示一个黄色的圆,按任意键后窗口关闭,返回到编辑器。
graphics.h 的局限性
为什么 graphics.h 被淘汰了?主要有以下几个原因:
- 平台不兼容:它是为 DOS 设计的,在 Windows 上,你可以使用一些“复古”的编译器(如 Turbo C++ 3.0 for Windows)或第三方库(如 WinBGIm)来模拟,但体验很差,在 Linux 和 macOS 上则几乎无法使用。
- 功能过时:它只支持非常基础的 2D 图形,无法处理 3D 图形、纹理、光照、现代窗口系统等。
- 性能低下:其底层实现依赖于古老的 BIOS 和 VGA 寄存器操作,与现代的 GPU 加速图形 API 相比,性能有天壤之别。
- 非标准:它不是 C 或 C++ 语言标准的一部分,任何现代的、遵循标准的编译器(如 GCC, Clang, MSVC)都不包含它。
现代替代方案
如果你想在 C/C++ 中进行图形编程,应该学习以下现代、跨平台的图形库:
| 库/框架 | 类型 | 难度 | 适用平台 | 主要特点 |
|---|---|---|---|---|
| EasyX | 2D Windows API | 简单 | Windows | graphics.h 在 Windows 下的最佳替代品,API 风格极其相似,非常适合入门。 |
| SFML | 2D/3D 多媒体库 | 中等 | Windows, Linux, macOS | 面向对象,功能强大(图形、音频、网络、输入),跨平台,是学习现代 C++ 图形编程的优秀选择。 |
| SDL (Simple DirectMedia Layer) | 2D/3D 多媒体库 | 中等 | Windows, Linux, macOS | 轻量级,底层,被广泛用于开发独立游戏(如 "Stardew Valley"),需要配合 OpenGL 进行 3D 渲染。 |
| Raylib | 2D/3D 游戏库 | 简单 | Windows, Linux, macOS | 现代设计,单头文件,易于上手,非常适合快速开发 2D/3D 游戏和原型。 |
| OpenGL | 3D 图形 API | 困难 | Windows, Linux, macOS | 行业标准的 3D 图形 API,功能极其强大,但学习曲线陡峭,需要理解大量图形学概念。 |
| DirectX | 3D 图形 API | 困难 | Windows | 微软开发的 Windows 平台专属 API,性能优异,主要用于商业游戏开发。 |
建议:
- 如果你只是想重温旧梦或体验
graphics.h的简单性,并且只在 Windows 上开发:可以尝试 EasyX。 - 如果你是初学者,想学习现代、跨平台的 C++ 图形编程:Raylib 或 SFML 是绝佳的起点。
- 如果你想深入学习计算机图形学,立志于游戏或 3D 开发:最终需要掌握 OpenGL 或 DirectX。
graphics.h 是一个时代的产物,它以其简单直观的方式,点燃了无数人对计算机图形学的兴趣,虽然它已不再适用于现代开发,但理解它的工作原理和基本绘图流程,对于学习计算机图形学的基础概念(如坐标系统、像素、颜色模型等)仍然非常有价值,当你准备好迈向更广阔的图形世界时,请转向上述提到的现代替代方案。
