Graphics.h在C语言中如何使用?

99ANYc3cd6
预计阅读时长 21 分钟
位置: 首页 C语言 正文

什么是 graphics.h

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

graphics.h 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 程序遵循以下步骤:

graphics.h c语言
(图片来源网络,侵删)
  1. 包含头文件: #include <graphics.h>
  2. 初始化图形模式: 使用 initgraph() 函数,这个函数会加载图形驱动程序,并将屏幕切换到图形模式。
  3. 进行图形绘制: 使用各种绘图函数(如 line(), circle(), rectangle() 等)在屏幕上作画。
  4. 关闭图形模式: 使用 closegraph() 函数,这个函数会释放图形系统占用的资源,并将屏幕切换回文本模式。

核心函数详解

下面是 graphics.h 中最常用的一些函数,分为几大类。

A. 初始化与关闭

  • *`void initgraph(int driver, int mode, char path)`**

    • 作用: 初始化图形系统,这是使用图形库的第一步。

    • 参数:

      graphics.h c语言
      (图片来源网络,侵删)
      • 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 是一个很好的选择,如果你想学习游戏开发,SDLSFML 是行业标准,如果你想深入 3D 图形,OpenGL 是必经之路。

希望这份详细的讲解能帮助你全面理解 graphics.h

-- 展开阅读全文 --
头像
dede登录后当前目录如何正确设置?
« 上一篇 02-17
double int在C语言中如何正确使用?
下一篇 » 02-17
取消
微信二维码
支付宝二维码

目录[+]