什么是 graphics.h?
graphics.h 是一个由 Borland 公司(也就是著名的 Turbo C/C++ 编译器的开发者)在 DOS(磁盘操作系统)时代为其 C 语言编译器提供的一个图形函数库。

它的主要目的是让程序员能够轻松地在屏幕上绘制图形,比如点、线、圆、矩形等,并能够设置颜色、填充图案、处理图像等,而无需直接操作复杂的硬件寄存器。
重要提示:
- 平台限制:
graphics.h是一个非标准的库,它与特定的编译器和操作系统紧密绑定,它主要用于 DOS 系统下的 Turbo C/C++ 编译器。 - 现代不适用: 在现代的 Windows、macOS 或 Linux 操作系统上,使用主流的编译器(如 GCC, Clang, MSVC)无法直接编译和运行
graphics.h的代码。 - 学习价值: 尽管它已过时,但
graphics.h提供了非常直观和简单的图形绘制接口,是学习计算机图形学基本概念(如像素、坐标、颜色模型)的绝佳入门工具。
如何使用 graphics.h?(以 Turbo C 为例)
如果你想在体验 graphics.h,你需要使用一个 DOS 模拟器或在虚拟机中安装 DOS 和 Turbo C,这里我们只讲解其核心概念和用法。
基本使用流程
一个典型的 graphics.h 程序遵循以下步骤:

- 包含头文件:
#include <graphics.h> - 初始化图形模式: 使用
initgraph()函数,这个函数会加载图形驱动程序,并将屏幕切换到图形模式。 - 进行图形绘制: 使用各种绘图函数(如
line(),circle(),rectangle()等)在屏幕上作画。 - 关闭图形模式: 使用
closegraph()函数,这个函数会释放图形系统占用的资源,并将屏幕切换回文本模式。
核心函数详解
下面是 graphics.h 中最常用的一些函数,分为几大类。
A. 初始化与关闭
-
*`void initgraph(int driver, int mode, char path)`**
-
作用: 初始化图形系统,这是使用图形库的第一步。
-
参数:
(图片来源网络,侵删)driver: 指向图形驱动程序类型的指针,常用DETECT,让系统自动检测合适的驱动。mode: 指图形模式。VGAHI(640x480, 16色),VGAMED(640x350, 16色),VGALO(640x350, 4色)。path: 图形驱动程序(.BGI文件)所在的路径,如果为空字符串,程序会在当前目录下查找。
-
示例:
#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()- 作用: 关闭图形模式,释放内存,恢复屏幕为文本模式。
B. 基本绘图函数
这些函数用于绘制基本的几何图形。
-
void putpixel(int x, int y, int color)- 作用: 在坐标
(x, y)处画一个点。 - 参数:
x,y: 像素的坐标。color: 颜色值。
- 示例:
putpixel(100, 200, WHITE);在 (100, 200) 位置画一个白色的点。
- 作用: 在坐标
-
void line(int x1, int y1, int x2, int y2)- 作用: 从点
(x1, y1)到点(x2, y2)画一条直线。 - 示例:
line(50, 50, 200, 150);
- 作用: 从点
-
void circle(int x, int y, int radius)- 作用: 以
(x, y)为圆心,radius为半径画一个圆。 - 示例:
circle(300, 200, 50);
- 作用: 以
-
void rectangle(int left, int top, int right, int bottom)- 作用: 画一个矩形。
left,top是左上角坐标,right,bottom是右下角坐标。 - 示例:
rectangle(100, 100, 300, 200);
- 作用: 画一个矩形。
-
void ellipse(int x, int y, int stangle, int endangle, int xradius, int yradius)- 作用: 画一个椭圆或椭圆弧。
- 参数:
(x, y): 椭圆中心。stangle,endangle: 起始和结束角度(度数,0度在3点钟方向)。xradius,yradius: x轴和y轴半径。
- 示例: 画一个完整的椭圆
ellipse(200, 200, 0, 360, 100, 50);。
C. 颜色与填充
-
设置颜色:
void setcolor(int color): 设置后续绘图(如线、边框)的颜色。void setfillstyle(int pattern, int color): 设置填充的样式和颜色。void floodfill(int x, int y, int bordercolor): 对一个封闭区域进行填充。(x, y)是区域内的任意一点,bordercolor是区域的边界颜色。void fillellipse(int x, int y, int xradius, int yradius): 画一个填充的椭圆。void bar(int left, int top, int right, int bottom): 画一个填充的矩形条。
-
颜色和样式常量:
- 颜色:
BLACK,BLUE,GREEN,CYAN,RED,MAGENTA,BROWN,LIGHTGRAY,WHITE等。 - 填充样式:
EMPTY_FILL,SOLID_FILL,LINE_FILL,SLASH_FILL等。
- 颜色:
-
示例:画一个填充的红色圆
setcolor(WHITE); // 设置边框为白色 setfillstyle(SOLID_FILL, RED); // 设置填充为纯红色 circle(200, 200, 80); // 画一个圆(作为边界) floodfill(200, 200, WHITE); // 从圆心开始填充
D. 文本输出
- *`void outtext(char string)`**
- 作用: 在当前位置输出字符串。
- *`void outtextxy(int x, int y, char string)`**
- 作用: 在指定坐标
(x, y)输出字符串。
- 作用: 在指定坐标
void settextstyle(int font, int direction, int size)- 作用: 设置文本的字体、方向和大小。
- 字体:
DEFAULT_FONT,TRIPLEX_FONT,SMALL_FONT等。 - 方向:
HORIZ_DIR(水平),VERT_DIR(垂直)。
一个完整的示例
下面是一个完整的 Turbo C 程序,它演示了上面提到的多个功能。
#include <graphics.h>
#include <conio.h> // 用于 getch()
#include <stdlib.h> // 用于 random()
int main() {
// 1. 初始化图形系统
int gd = DETECT, gm;
initgraph(&gd, &gm, "");
// 2. 绘制背景和标题
setcolor(WHITE);
setfillstyle(SOLID_FILL, BLUE);
bar(0, 0, getmaxx(), getmaxy());
settextstyle(TRIPLEX_FONT, HORIZ_DIR, 3);
setcolor(YELLOW);
outtextxy(getmaxx()/2 - 100, 20, "Hello, Graphics World!");
// 3. 画一个房子
// 房子的主体 (矩形)
setcolor(BROWN);
setfillstyle(SOLID_FILL, LIGHTGRAY);
rectangle(100, 250, 300, 400);
floodfill(150, 300, BROWN);
// 屋顶 (三角形)
setcolor(RED);
setfillstyle(SOLID_FILL, RED);
line(100, 250, 200, 150);
line(200, 150, 300, 250);
floodfill(200, 200, RED);
// 门
setcolor(BLACK);
setfillstyle(SOLID_FILL, BROWN);
rectangle(170, 320, 230, 400);
floodfill(180, 350, BLACK);
// 窗户
setcolor(BLUE);
setfillstyle(SOLID_FILL, CYAN);
rectangle(120, 280, 160, 320);
floodfill(130, 290, BLUE);
rectangle(240, 280, 280, 320);
floodfill(250, 290, BLUE);
// 4. 画一些随机的星星
setcolor(WHITE);
randomize(); // 初始化随机数种子
for (int i = 0; i < 50; i++) {
int x = random(getmaxx());
int y = random(200); // 只在顶部画
putpixel(x, y, WHITE);
}
// 5. 等待用户按键,然后关闭图形模式
getch();
closegraph();
return 0;
}
现代替代方案
既然 graphics.h 已经过时,那么在现代 C/C++ 开发中,我们应该使用什么来做图形编程呢?
| 库/框架 | 特点 | 适用平台 | 语言 |
|---|---|---|---|
| SDL (Simple DirectMedia Layer) | 强烈推荐,轻量级、跨平台、功能强大(图形、声音、输入、网络),底层封装了 OpenGL/DirectX,非常适合游戏开发和多媒体应用。 | Windows, macOS, Linux, Android, iOS | C, C++ |
| SFML (Simple and Fast Multimedia Library) | 强烈推荐,与 SDL 类似,但面向对象设计更优雅,API 更现代,文档友好,易于上手。 | Windows, macOS, Linux, Android, iOS | C++ |
| OpenGL | 行业标准,一个专业的、跨平台的图形 API,用于渲染 2D 和 3D 图形,它是一个“状态机”,学习曲线较陡,但功能极其强大。 | 几乎所有平台 | C, C++ |
| Raylib | 现代、简洁,一个简单的、易于使用的库,专注于 2D 和 3D 游戏编程,单文件头,配置简单,非常适合快速原型开发和小型项目。 | Windows, macOS, Linux | C, C++ |
| Qt | 一个完整的应用程序框架,而不仅仅是图形库,如果你要开发一个有复杂 GUI 界面的桌面应用程序,Qt 是不二之选。 | 跨平台 | C++ |
| Windows API (GDI/GDI+) | 仅适用于 Windows,GDI 是较老的 2D 图形接口,GDI+ 是其增强版,可以直接在 C/C++ 中调用 Windows 系统函数来绘图。 | Windows | C, C++ |
如果你是初学者,想快速体验图形编程,Raylib 是一个很好的选择,如果你想学习游戏开发,SDL 或 SFML 是行业标准,如果你想深入 3D 图形,OpenGL 是必经之路。
希望这份详细的讲解能帮助你全面理解 graphics.h!
