Библиотека graphics.h: полное руководство для C/C++ разработчиков
Для кого эта статья:
- Начинающие программисты, изучающие C/C++ и графическое программирование
- Студенты и преподаватели, использующие graphics.h в образовательных целях
Люди, заинтересованные в разработке простых игр и графических приложений
Библиотека
graphics.h— это ключ к визуализации алгоритмов и созданию графических интерфейсов в C/C++, без которой начинающие программисты часто остаются в плену консольных приложений. Овладение этим инструментом открывает двери в мир интерактивной графики, позволяя превращать сухой код в живые изображения, анимации и даже простые игры. Данное руководство раскрывает полный потенциалgraphics.h, предоставляя детальное описание каждой функции с примерами кода, готовыми к использованию в ваших проектах. 🎨
Изучая функции библиотеки
graphics.h, вы делаете первые шаги в визуальном программировании. Хотите развить эти навыки до профессионального уровня? Профессия графический дизайнер от Skypro — идеальное продолжение вашего пути. Курс сочетает технические знания с творческим подходом, позволяя создавать не просто функциональные, а визуально привлекательные интерфейсы. Преобразуйте понимание базовых графических примитивов в умение создавать профессиональные дизайн-проекты!
История и назначение библиотеки
Библиотека graphics.h возникла в 1980-х годах как часть Borland Graphics Interface (BGI), разработанная компанией Borland для компилятора Turbo C. Изначально созданная для DOS-систем, она предоставила программистам доступ к графическим возможностям компьютеров того времени, когда большинство приложений были ограничены текстовым интерфейсом. 📚
Основное назначение библиотеки — предоставление набора функций для работы с графикой в программах на языках C и C++. Она позволяет:
- Рисовать базовые графические примитивы (линии, круги, прямоугольники)
- Управлять цветами и стилями рисования
- Создавать текст различных шрифтов и размеров
- Разрабатывать простые анимации
- Обрабатывать ввод от мыши и клавиатуры для интерактивности
Несмотря на возраст, graphics.h остаётся актуальным инструментом в образовательной среде, где используется для обучения основам программирования графики. Её относительная простота позволяет студентам сосредоточиться на алгоритмах, не отвлекаясь на сложности современных графических библиотек.
Антон Макаров, преподаватель компьютерной графики
Когда я только начинал преподавать, университет перешёл с Pascal на C++ и мне пришлось срочно подготовить курс по программированию графики. Выбор пал на graphics.h благодаря её простоте и наглядности. Помню, как один из моих студентов, изучив всего несколько базовых функций, за неделю создал анимированную визуализацию алгоритма сортировки — цветные столбцы меняли позиции на экране в реальном времени. Этот проект произвёл впечатление даже на скептически настроенных преподавателей старой школы. С тех пор я уверен: graphics.h — идеальный первый шаг в мир графического программирования, который даёт быстрые результаты и мотивирует студентов к дальнейшему изучению.
Для использования библиотеки в современных системах требуются дополнительные настройки или использование эмуляторов, таких как DOSBox, поскольку graphics.h не является стандартной библиотекой C/C++ и напрямую не поддерживается в современных операционных системах Windows, Linux или macOS.
| Период | Значимые события | Влияние на развитие |
|---|---|---|
| 1980-е годы | Создание BGI и библиотеки graphics.h | Появление доступных инструментов графики для C/C++ |
| 1990-е годы | Пик популярности в образовательной среде | Формирование стандартов обучения графическому программированию |
| 2000-е годы | Переход к Windows-ориентированным библиотекам | Снижение коммерческого использования, сохранение в образовании |
| 2010-е — н.в. | Эмуляция и порты для современных систем | Продолжение использования в учебных целях |

Основные графические функции и их синтаксис в проектах
Освоение библиотеки graphics.h начинается с понимания базовых функций, которые позволяют инициализировать графический режим и создавать простейшие визуальные элементы. Рассмотрим основные функции, без которых невозможно создание графических приложений. 🖥️
Инициализация и завершение графического режима:
initgraph(&gd, &gm, "path")— инициализирует графический режим, где gd — графический драйвер, gm — графический режим, path — путь к драйверам BGIclosegraph()— закрывает графический режим и возвращает систему в текстовый режимdetectgraph(&gd, &gm)— автоматически определяет лучший доступный графический драйвер и режим
Пример инициализации графического режима:
#include <graphics.h>
#include <conio.h>
int main() {
int gd = DETECT, gm;
initgraph(&gd, &gm, "C:\\TURBOC3\\BGI");
// Графические операции
getch(); // Ожидание нажатия клавиши
closegraph();
return 0;
}
Рисование базовых примитивов:
line(x1, y1, x2, y2)— рисует линию между точками (x1,y1) и (x2,y2)circle(x, y, radius)— рисует окружность с центром в точке (x,y) и заданным радиусомrectangle(left, top, right, bottom)— рисует прямоугольник по координатам противоположных угловellipse(x, y, stangle, endangle, xradius, yradius)— рисует эллипс или его дугуarc(x, y, stangle, endangle, radius)— рисует дугу окружности
Пример создания простой композиции:
// Рисуем домик
rectangle(100, 200, 300, 350); // Стены дома
line(100, 200, 200, 100); // Левая часть крыши
line(200, 100, 300, 200); // Правая часть крыши
rectangle(175, 250, 225, 350); // Дверь
circle(185, 300, 5); // Дверная ручка
rectangle(125, 225, 175, 275); // Окно
Работа с пикселями и заполнение:
putpixel(x, y, color)— устанавливает цвет пикселя по координатамgetpixel(x, y)— возвращает цвет пикселя по координатамfloodfill(x, y, border_color)— заполняет область, ограниченную цветом border_color, начиная с точки (x,y)
Функции для работы с текстом:
outtextxy(x, y, "text")— выводит текст в заданной позицииsettextstyle(font, direction, size)— устанавливает шрифт, направление и размер текстаtextheight("text")— возвращает высоту текста в пикселяхtextwidth("text")— возвращает ширину текста в пикселях
| Категория функций | Функция | Синтаксис | Типичное применение |
|---|---|---|---|
| Инициализация | initgraph | initgraph(&gd, &gm, "path") | Запуск графического режима |
closegraph | closegraph() | Завершение графического режима | |
| Линии и контуры | line | line(x1, y1, x2, y2) | Создание границ и контуров |
circle | circle(x, y, radius) | Круглые элементы интерфейса | |
rectangle | rectangle(left, top, right, bottom) | Кнопки, рамки, окна | |
| Заполнение | floodfill | floodfill(x, y, border_color) | Заливка замкнутых областей |
putpixel | putpixel(x, y, color) | Рисование точечных объектов |
Работа с цветом и стилем изображений в
Управление цветами и стилями рисования — одна из ключевых возможностей библиотеки graphics.h, позволяющая создавать визуально привлекательные и информативные графические интерфейсы. Грамотное использование цветовых схем и различных стилей линий значительно повышает удобочитаемость графических элементов. 🌈
Основные функции для работы с цветом:
setcolor(color)— устанавливает цвет для всех последующих операций рисованияgetcolor()— возвращает текущий цвет рисованияsetbkcolor(color)— устанавливает цвет фонаgetbkcolor()— возвращает текущий цвет фонаsetfillstyle(pattern, color)— устанавливает стиль и цвет заполненияgetfillsettings(&fillinfo)— получает текущие настройки заполнения
В библиотеке graphics.h используются предопределённые константы для 16 основных цветов:
- BLACK (0)
- BLUE (1)
- GREEN (2)
- CYAN (3)
- RED (4)
- MAGENTA (5)
- BROWN (6)
- LIGHTGRAY (7)
- DARKGRAY (8)
- LIGHTBLUE (9)
- LIGHTGREEN (10)
- LIGHTCYAN (11)
- LIGHTRED (12)
- LIGHTMAGENTA (13)
- YELLOW (14)
- WHITE (15)
Пример использования различных цветов:
// Рисуем цветной домик
setcolor(BLUE);
rectangle(100, 200, 300, 350); // Синие стены
setcolor(RED);
line(100, 200, 200, 100); // Красная левая часть крыши
line(200, 100, 300, 200); // Красная правая часть крыши
setcolor(GREEN);
rectangle(175, 250, 225, 350); // Зелёная дверь
setcolor(YELLOW);
circle(185, 300, 5); // Желтая дверная ручка
setcolor(CYAN);
rectangle(125, 225, 175, 275); // Голубое окно
Работа со стилями линий:
Для изменения внешнего вида линий библиотека предлагает несколько функций:
setlinestyle(style, pattern, thickness)— устанавливает стиль, образец и толщину линииgetlinesettings(&lineinfo)— получает текущие настройки линии
Библиотека поддерживает следующие стили линий:
- SOLID_LINE (0) — сплошная линия
- DOTTED_LINE (1) — точечная линия
- CENTER_LINE (2) — центральная линия (длинная черта, короткая черта, короткая черта)
- DASHED_LINE (3) — пунктирная линия
- USERBIT_LINE (4) — пользовательский стиль, определяемый параметром pattern
Пример использования различных стилей линий:
// Демонстрация стилей линий
setcolor(WHITE);
// Сплошная линия
setlinestyle(SOLID_LINE, 0, NORM_WIDTH);
line(50, 50, 200, 50);
outtextxy(210, 50, "SOLID_LINE");
// Точечная линия
setlinestyle(DOTTED_LINE, 0, NORM_WIDTH);
line(50, 100, 200, 100);
outtextxy(210, 100, "DOTTED_LINE");
// Центральная линия
setlinestyle(CENTER_LINE, 0, NORM_WIDTH);
line(50, 150, 200, 150);
outtextxy(210, 150, "CENTER_LINE");
// Пунктирная линия
setlinestyle(DASHED_LINE, 0, NORM_WIDTH);
line(50, 200, 200, 200);
outtextxy(210, 200, "DASHED_LINE");
// Толстая линия
setlinestyle(SOLID_LINE, 0, THICK_WIDTH);
line(50, 250, 200, 250);
outtextxy(210, 250, "THICK_WIDTH");
Работа со стилями заполнения:
Функция setfillstyle позволяет выбирать различные узоры для заполнения замкнутых фигур:
- EMPTY_FILL (0) — без заполнения
- SOLID_FILL (1) — сплошное заполнение
- LINE_FILL (2-3) — заполнение линиями
- LTSLASH_FILL (4) — заполнение наклонными линиями
- SLASH_FILL (5) — заполнение наклонными линиями (гуще)
- BKSLASH_FILL (6) — заполнение обратными наклонными линиями
- LTBKSLASH_FILL (7) — заполнение обратными наклонными линиями (реже)
- HATCH_FILL (8-9) — штриховка
- XHATCH_FILL (10) — перекрёстная штриховка
- INTERLEAVE_FILL (11) — чередующееся заполнение
- WIDEDOTFILL (12) — редкие точки
- CLOSEDOTFILL (13) — частые точки
- USER_FILL (12) — пользовательский стиль
Михаил Сергеев, разработчик учебных программ
Помню свой первый серьезный проект с graphics.h — визуализатор алгоритмов сортировки для младшекурсников. Ключевой проблемой было сделать так, чтобы студенты могли легко различать разные элементы массива и процессы, происходящие с ними. Решение пришло через продуманное использование цветовой схемы: каждая операция сравнения подсвечивалась голубым, операции обмена — красным, а отсортированные элементы постепенно становились зелеными. Для элементов массива я использовал разные стили заполнения в зависимости от их текущего статуса. После внедрения этой визуализации понимание алгоритмов улучшилось на 40%, а количество студентов, успешно реализовавших собственные сортировки, выросло вдвое. Правильное использование цвета и стиля превратило абстрактные алгоритмы в понятные визуальные последовательности.
Функции для создания анимации и интерактивности
Создание анимированных эффектов и интерактивных элементов — ключевое преимущество графического программирования, которое превращает статичные изображения в динамические приложения. Библиотека graphics.h предоставляет набор инструментов, позволяющих реализовать базовую анимацию и обработку пользовательского ввода. 🎮
Функции для создания анимации:
cleardevice()— очищает экран, заполняя его текущим цветом фонаclearviewport()— очищает только текущий видовой экранdelay(milliseconds)— приостанавливает выполнение программы на указанное количество миллисекундgetimage(left, top, right, bottom, buffer)— сохраняет указанную прямоугольную область экрана в буфереputimage(left, top, buffer, operation)— размещает сохраненное изображение на экране с возможностью применения различных операций наложения
Основной принцип создания анимации в graphics.h заключается в циклическом обновлении изображения:
// Простая анимация движущегося круга
int x = 0;
int radius = 20;
for(int i = 0; i < 100; i++) {
cleardevice(); // Очищаем экран
setcolor(YELLOW);
circle(x, 100, radius); // Рисуем круг в новой позиции
setfillstyle(SOLID_FILL, YELLOW);
floodfill(x, 100, YELLOW); // Заливаем круг
x += 5; // Изменяем позицию для следующего кадра
delay(50); // Задержка между кадрами
}
Функции для двойной буферизации:
Для устранения мерцания при анимации используется техника двойной буферизации, когда изображение сначала формируется в памяти, а затем одним действием выводится на экран:
// Пример двойной буферизации
void *buffer;
unsigned int size;
// Определяем размер буфера
size = imagesize(0, 0, getmaxx(), getmaxy());
buffer = malloc(size);
if(buffer) {
// Рисуем в буфере
getimage(0, 0, getmaxx(), getmaxy(), buffer);
// [Здесь код рисования в буфере]
// Выводим содержимое буфера на экран
putimage(0, 0, buffer, COPY_PUT);
free(buffer);
}
Функции для обработки пользовательского ввода:
kbhit()— проверяет, была ли нажата клавишаgetch()— ожидает нажатия клавиши и возвращает её кодgetche()— аналогичноgetch(), но выводит символ на экранbioskey(0)— ожидает нажатия клавиши и возвращает скан-код
В более поздних реализациях доступны также функции для работы с мышью:
initwymouse()— инициализирует мышьshowmouse()— показывает указатель мышиhidemouse()— скрывает указатель мышиgetmousepos(&x, &y)— получает текущие координаты мышиismouseclick(button)— проверяет, была ли нажата кнопка мыши
Пример создания интерактивной программы с обработкой клавиатуры:
// Управляемый круг с клавиатуры
int x = 100, y = 100;
int radius = 20;
char key;
while(1) {
cleardevice();
// Рисуем круг
circle(x, y, radius);
// Выводим инструкции
outtextxy(10, 10, "Используйте WASD для перемещения, ESC для выхода");
// Обновляем экран
delay(10);
// Проверяем нажатие клавиши
if(kbhit()) {
key = getch();
// Обрабатываем нажатие
switch(key) {
case 'w': y -= 5; break; // Вверх
case 's': y += 5; break; // Вниз
case 'a': x -= 5; break; // Влево
case 'd': x += 5; break; // Вправо
case 27: return 0; // ESC – выход
}
}
}
| Тип взаимодействия | Функция | Применение | Ограничения |
|---|---|---|---|
| Анимация | cleardevice() | Обновление кадра | Вызывает мерцание без буферизации |
delay() | Контроль скорости анимации | Зависит от производительности системы | |
| Буферизация | getimage() | Сохранение фрагмента экрана | Ограниченный размер буфера |
putimage() | Вывод подготовленного изображения | Ограниченные режимы наложения | |
| Ввод | kbhit() | Неблокирующая проверка нажатия | Только клавиатура |
getch() | Блокирующее ожидание ввода | Приостанавливает выполнение |
Практическое применение: готовые решения для ваших проектов
Теоретические знания о функциях graphics.h обретают смысл только при их практическом применении. В этом разделе представлены готовые решения типовых задач, с которыми сталкиваются разработчики при использовании библиотеки. Эти примеры можно использовать как строительные блоки для создания собственных графических приложений. 🛠️
1. Создание пользовательского интерфейса — кнопки и меню
// Функция для создания интерактивной кнопки
bool Button(int left, int top, int right, int bottom, char* text) {
// Рисуем кнопку
setcolor(WHITE);
setfillstyle(SOLID_FILL, DARKGRAY);
bar(left, top, right, bottom); // Заполненный прямоугольник
rectangle(left, top, right, bottom);
// Центрируем текст
int textX = left + (right – left – textwidth(text)) / 2;
int textY = top + (bottom – top – textheight(text)) / 2;
outtextxy(textX, textY, text);
// Проверка нажатия мыши (в современных реализациях)
if (ismouseclick(WM_LBUTTONDOWN)) {
int mouseX, mouseY;
getmousepos(&mouseX, &mouseY);
if (mouseX >= left && mouseX <= right && mouseY >= top && mouseY <= bottom) {
// Эффект нажатия
setfillstyle(SOLID_FILL, LIGHTGRAY);
bar(left+1, top+1, right-1, bottom-1);
outtextxy(textX, textY, text);
delay(100);
return true; // Кнопка была нажата
}
}
return false; // Кнопка не была нажата
}
2. Создание графиков функций
// Функция для отрисовки координатных осей
void DrawAxis(int width, int height) {
setcolor(WHITE);
line(0, height/2, width, height/2); // Ось X
line(width/2, 0, width/2, height); // Ось Y
// Метки делений
for(int i = 50; i < width; i += 50) {
line(i, height/2-3, i, height/2+3);
char label[10];
sprintf(label, "%d", i – width/2);
outtextxy(i-10, height/2+5, label);
}
for(int i = 50; i < height; i += 50) {
line(width/2-3, i, width/2+3, i);
char label[10];
sprintf(label, "%d", height/2 – i);
outtextxy(width/2+5, i-5, label);
}
}
// Рисование графика функции y = sin(x)
void DrawSinGraph(int width, int height) {
DrawAxis(width, height);
setcolor(YELLOW);
// Масштабный коэффициент
double scale = 40.0;
// Начальная точка
int prevX = 0;
int prevY = height/2 – (int)(sin(0) * scale);
// Отрисовка графика
for(int x = 1; x < width; x++) {
double angle = (x – width/2) / scale;
int y = height/2 – (int)(sin(angle) * scale);
line(prevX, prevY, x, y);
prevX = x;
prevY = y;
}
}
3. Создание анимированных диаграмм
// Функция для отрисовки столбчатой диаграммы с анимацией
void AnimatedBarChart(int data[], int size, char* labels[]) {
int maxHeight = getmaxy() – 100;
int barWidth = getmaxx() / (size + 2); // С отступами
// Находим максимальное значение для масштабирования
int maxValue = 0;
for(int i = 0; i < size; i++) {
if(data[i] > maxValue) maxValue = data[i];
}
// Анимация роста столбцов
for(int height = 1; height <= 100; height++) {
cleardevice();
// Рисуем оси
setcolor(WHITE);
line(50, 50, 50, maxHeight + 50);
line(50, maxHeight + 50, getmaxx() – 50, maxHeight + 50);
// Рисуем столбцы
for(int i = 0; i < size; i++) {
int barHeight = (data[i] * height * maxHeight) / (maxValue * 100);
int x1 = 100 + i * barWidth;
int y1 = maxHeight + 50 – barHeight;
int x2 = x1 + barWidth – 20;
int y2 = maxHeight + 50;
// Выбираем разные цвета для столбцов
setfillstyle(SOLID_FILL, i + 1);
bar(x1, y1, x2, y2);
// Подпись данных
char valueStr[10];
sprintf(valueStr, "%d", data[i]);
outtextxy(x1 + barWidth/2 – textwidth(valueStr)/2, y1 – 20, valueStr);
// Подпись категории
outtextxy(x1 + barWidth/2 – textwidth(labels[i])/2, y2 + 10, labels[i]);
}
delay(30); // Скорость анимации
}
}
4. Создание простой игры "Змейка"
struct Point { int x, y; };
void Snake() {
const int WIDTH = 640, HEIGHT = 480;
const int CELL = 20; // Размер ячейки
// Инициализация змейки
Point snake[100]; // Максимальная длина змейки
int length = 3; // Начальная длина
// Начальное положение и направление
for(int i = 0; i < length; i++) {
snake[i].x = WIDTH / 2 – i * CELL;
snake[i].y = HEIGHT / 2;
}
int dirX = 1, dirY = 0; // Направление движения
// Положение еды
Point food;
food.x = (rand() % (WIDTH / CELL)) * CELL;
food.y = (rand() % (HEIGHT / CELL)) * CELL;
while(1) {
cleardevice();
// Рисуем границы
rectangle(0, 0, WIDTH, HEIGHT);
// Рисуем еду
setcolor(YELLOW);
setfillstyle(SOLID_FILL, YELLOW);
fillellipse(food.x + CELL/2, food.y + CELL/2, CELL/2, CELL/2);
// Рисуем змейку
setcolor(GREEN);
setfillstyle(SOLID_FILL, GREEN);
for(int i = 0; i < length; i++) {
// Голова другим цветом
if(i == 0) {
setfillstyle(SOLID_FILL, LIGHTGREEN);
} else {
setfillstyle(SOLID_FILL, GREEN);
}
bar(snake[i].x, snake[i].y, snake[i].x + CELL, snake[i].y + CELL);
}
// Проверка нажатия клавиш
if(kbhit()) {
char key = getch();
switch(key) {
case 'w': if(dirY != 1) { dirX = 0; dirY = -1; } break;
case 's': if(dirY != -1) { dirX = 0; dirY = 1; } break;
case 'a': if(dirX != 1) { dirX = -1; dirY = 0; } break;
case 'd': if(dirX != -1) { dirX = 1; dirY = 0; } break;
case 27: return; // ESC – выход
}
}
// Обновление позиции змейки
for(int i = length-1; i > 0; i--) {
snake[i] = snake[i-1];
}
snake[0].x += dirX * CELL;
snake[0].y += dirY * CELL;
// Проверка на столкновение с едой
if(snake[0].x == food.x && snake[0].y == food.y) {
length++;
food.x = (rand() % (WIDTH / CELL)) * CELL;
food.y = (rand() % (HEIGHT / CELL)) * CELL;
}
// Проверка на столкновение с границами
if(snake[0].x < 0 || snake[0].x >= WIDTH || snake[0].y < 0 || snake[0].y >= HEIGHT) {
outtextxy(WIDTH/2 – 50, HEIGHT/2, "Game Over!");
getch();
return;
}
// Проверка на столкновение с собой
for(int i = 1; i < length; i++) {
if(snake[0].x == snake[i].x && snake[0].y == snake[i].y) {
outtextxy(WIDTH/2 – 50, HEIGHT/2, "Game Over!");
getch();
return;
}
}
delay(100); // Скорость игры
}
}
- Проекты для начинающих: кнопки и простые меню, графики функций, простые анимации
- Проекты среднего уровня: визуализации алгоритмов, диаграммы с динамическими данными
- Продвинутые проекты: простые игры (змейка, пинг-понг, тетрис), базовые графические редакторы
При разработке графических приложений с использованием graphics.h следует учитывать ограничения библиотеки и спецификации целевой системы. Несмотря на устаревание, библиотека остаётся ценным инструментом для образовательных целей и быстрого прототипирования.
Знание основных функций
graphics.hоткрывает новые горизонты в визуализации алгоритмов и создании интерактивных программ. Применяя эти инструменты, вы превращаете абстрактные концепции программирования в наглядные визуальные представления. Библиотека, несмотря на возраст, продолжает служить мостом между консольным и графическим программированием, позволяя сфокусироваться на логике приложения, а не на сложностях современных графических API. Используйте представленные примеры как строительные блоки для ваших проектов, экспериментируйте с комбинациями функций и создавайте уникальные графические решения, которые сделают ваши программы более понятными и привлекательными для пользователей.
Читайте также
- SDL-библиотека для графического программирования на C – что это такое
- Как установить graphics.h: настройка библиотеки в разных ОС
- Графика в C: освоение примитивов для создания визуальных приложений
- Рисование прямоугольников в C: библиотеки, функции и алгоритмы
- Графическое программирование на C с Allegro: возможности библиотеки
- Графические библиотеки C: выбор инструментов для 2D и 3D разработки
- Библиотека graphics.h в C/C++: 15 примеров от новичка до профи
- Настройка графики на C: OpenGL, GLFW, SDL2 для новичков
- Построение графиков функций в C: лучшие библиотеки и примеры
- Загрузка и сохранение изображений в C: оптимальные библиотеки