Ncurses для windows c

Ncurses для windows c

Ввод символа
int getch()
возвращает введённый символ (аналогична функции getchar) Если включён режим обработки командных клавиш можно узнать о нажатии функциональных клавиш и клавиш управления курсором. Константы соответствующие кодам этих клавиш можно найти в файле curses.h. Вот самые важные из них:
KEY_DOWN, KEY_UP, KEY_LEFT, KEY_RIGHT — клавиши стрелок
KEY_F(n) Функциональные клавиши n может принимать значения от 0 до 63
KEY_BACKSPACE Backspace
KEY_DC Delete
KEY_IC Insert
KEY_HOME Home
KEY_END End
KEY_NPAGE Page Down
KEY_PPAGE Page Up

Ввод строки по формату
int scanw(char *fmt. )
(аналогична функции scanf) Например для ввода пользователем числа в переменную i вызов функции будет выглядеть так:
scanw(«%d», &i);

Режимы ввода

Автоматическое отображение при вводе
int noecho() и int echo()
Функция noecho отключает автоматическое отображение при вводе. Это нужно, если программист сам хочет решать вывоить ему полученный символ или нет. Функция echo отменяет действие функции noecho.

Установка времени ожидания
int halfdelay(int tenths)
По умолчанию такие функции как getch ждут ввода до тех пор пока пользователь не нажмёт клавишу. Функция halfdelay устанавливает режим в котором ввод ожидается tenths десятых долей секунды, затем в getch возращается ERR, если пользователь не нажимал клавиши. Отменить этот режим можно вызвав функцию nocbreak().

Обработка командных клавиш
int keypad(WINDOW *win, bool bf)
По умолчанию обработку таких клавиш, как клавиши управления курсором и функциональные клавиши берёт на себя терминал. Чтобы установить режим обработки командных клавиш нужно вызвать функцию keypad с TRUE в качестве второго параметра. Первый параметр указывает для какого окна Вы хотите установить данный режим. Если Вы не используете окна можно указать stdscr. Для отключения нужно передать FALSE во втором параметре.

Управление курсором

. Внимание: Все координаты в ncurses отсчитываются от верхнего левого угла и начиная с 0. Таким образом верхний левый угол имеет координаты (0,0)

Перемещение курсора
int move(int y, int x)
устанавливает курсор в позицию x,y

Получение текущих координат курсора
void getyx(WINDOW *win, int y, int x)
В переменные x,y записываются текущие координаты окна win. Если Вы не используете окна в качестве первого параметра можно указать stdscr.

Получить размеры экрана можно вызвав функции getmaxx(stdscr) и getmaxy(stdscr) они возвращают максимальное значение x и y соответственно для данного экрана.

Другие полезные функции

Очистка экрана
int clear()
заполняет весь экран пробелами

Очистка от курсора до конца строки
int clrtoeol()
заменяет пробелами интервал от курсора до конца строки

Очистка от курсора до конца экрана
int clrtobot()
заменяет пробелами интервал от курсора до конца экрана

Вставка/удаление строк
int insdelln(int n)
для положительного n вставляет n пустых строк для отрицательного удаляет n строк.

Удаление символа
int delch()
удаляет символ на котором стоит курсор (символы стоящие справа от курсора сдвигаются влево)

Удаление строки
int deleteln()
удаляет строку на которой стоит курсор (строки стоящие ниже сдвигаются вверх)

Окно — прямоугольная область экрана с которой можно работать как с целым экраном (очищать, выводить текст и т.д.). То есть осуществлять вывод только в определённую прямоугольную область экрана.

После инициализации создаётся окно stdscr с максимально возможными для данного терминала размерами. Если окна не будут использоваться во всех функциях требующих окно можно указывать stdscr.

Внутри одного окна также можно создать окна которые будет называться подокнами

Создание окна
WINDOW *newwin(int nlines, int ncols, int begin_y, int begin_x)
создаёт окно в котором nlines строк и ncols столбцов (если nlines или ncols равны 0 то им будет присвоено begin_y или begin_x) с координатами левого верхнего угла (begin_x,begin_y). При вызове с нулевыми аргументами ф-ия создаст окно размером с экран.

Читайте также:  Внешний вид windows персонализация

Создание подокна
WINDOW *subwin(WINDOW *orig, int nlines, int ncols, int begin_y, int begin_x)
создаёт подокно в котором nlines строк и ncols столбцов (если nlines или ncols равны 0 то им будет присвоено begin_y или begin_x) с координатами левого верхнего угла (begin_x,begin_y) относительно всего экрана. origwin — родительское окно.

Создание подокна 2
WINDOW *derwin(WINDOW *orig, int nlines, int ncols, int begin_y, int begin_x)
делает то же самое что и subwin, за исключением того, что begin_x и begin_y координаты относительно окна родителя origwin.

Удаление окна/подокна
int delwin(WINDOW *win)
удаляет окно/подокно win.

Перемещение окна
int mvwin(WINDOW *win, int y, int x)
перемещает окно win в новую позицию (x,y) левого верхнего угла.

Перемещение подокна
int mvderwin(WINDOW *win, int par_y, int par_x)
перемещает подокно win в новую позицию (x,y) левого верхнего угла относительно родительского окна.

Окно играет роль ограничителя вывод на экран. При вводе-выводе в перекрывающиеся окна данные в одном окне могут быть затёрты данными выводимыми в другое окно в месте перекрытия окон. Если Вам нужно обеспечить вывод в перекрывающиеся окна так чтобы вывод в одно окно не повредил данные другого окна можно воспользоваться панелями.

Панели

Под панелью в библиотеке ncurses понимается окно к которому добавляется глубина. Все панели заносятся в стек панелей. Глубина указывает в каком порядке располагаются панели на экране. Каждую панель можно переместить вверх или вниз всех остальных панелей. Можно скрыть и показать панель.

Для использования панелей нужно подключить библиотеку панелей:
#include

Если вы используете panel.h можно не подключать библиотеку ncurses.h потому, что panel.h сама подключает ncurses.h.

Для компиляции программ использующих панели так же добавляется ключ -lpanel:

gcc имя_файла.c -o имя_файла -lpanel -lncurses

. Внимание: при компиляции с библиотеками зависящими от ncurses (в данном случае panel) ключ подключения ncurses (-lncurses) должен всегда стоять последним.

Создание панели
PANEL *new_panel(WINDOW *win)
Панель создаётся из уже созданного окна win. После создания панель перемещается в вершину стека панелей.

Удаление панели
int del_panel(PANEL *pan)
Удаляет панель pan. Окно связанное с панелью нужно удалять самостоятельно.

Получение окна связанного с панелью
WINDOW *panel_window(const PANEL *pan)
Возвращает указатель на окно связанное с панелью pan.

Обновление панелей
void update_panels()
Обновляет стек панелей. Для реального отображения на экране нужно вызвать функцию doupdate().

Скрытие панели
int hide_panel(PANEL *pan)
Удаляет панель pan из стека панелей. Таким образом при обновлении экрана мы её не увидим.

Отображение панели
int show_panel(PANEL *pan)
Делает скрытую панель pan снова видимой размещая её при этом поверх остальных панелей.

Перемещение панели поверх всех
int top_panel(PANEL *pan)
Перемещает панель в стеке поверх всех оставшихся панелей.

Перемещение панели ниже всех
int bottom_panel(PANEL *pan)
Перемещает панель в стеке ниже всех оставшихся панелей.

Перемещение панели
int move_panel(PANEL *pan, int starty, int startx)
Перемещает панель pan так, чтобы его верхний левый угол оказался в точке (startx,starty). Положение в стеке панелей не изменяется.

Замена окна
int replace_panel(PANEL *pan, WINDOW *window)
Заменяет в панели pan текущее окно на окно window. Используется для таких операций как изменение размеров панели. Положение в стеке панелей не изменяется.

Получение панели выше
PANEL *panel_above(const PANEL *pan)
Позволяет узнать какая панель находится выше панели pan. Если 0 заничит выше pan нет панелей.

Получение панели ниже
PANEL *panel_below(const PANEL *pan)
Позволяет узнать какая панель находится ниже панели pan. Если 0 заничит ниже pan нет панелей.

Установка указателя на пользовательские данные
int set_panel_userptr(PANEL *pan, const void *ptr)
В каждой панели можно установить указатель на любую структуру. Данная функция позволяет установить этот указатель ptr для панели pan.

Читайте также:  Как взломать windows lite

Получение указателя на пользовательские данные
int set_panel_userptr(PANEL *pan, const void *ptr)
Данная функция позволяет получить на заданный функцией set_panel_userptr указатель ptr для панели pan.

Установка PDcurses в Windows

ncurses — удобный и мощный фреймворк для создания графики в текстовом режиме. Но, к сожалению, он предназначен для UNIX -подобных ОС. Чтобы исправить это досадное упущение была создана PDcurses — аналог ncurses под windows .

Рассматривать использование PDcurses будем на примере Dev-Cpp . Если у вас ещё нет этой IDE, то бежим сюда, скачиваем, устанавливаем.

Получение PDcurses

PDcurses в формате .zip можно скачать тут.

Компиляция PDcurses

PDcurses распространяется в форме исходного кода. То есть перед использованием библиотеки её нужно скомпилировать. Чтобы это сделать нужен компилятор MinGW (который, как и PDcurses , является аналогом компилятора UNIX -систем, gcc ).

Первым делом распаковываем архив, к примеру в папку, куда вы установили Dev-Cpp , в моём случае это C:\Dev-Cpp\ . Лучше не прямо в эту папку, а, например, в папку . \Dev-Cpp\curses\ , так будет удобнее.

Для компиляции можно воспользоваться компилятором, который идёт вместе с Dev-Cpp , но у меня он неправильно компилировал эту библиотеку (не спрашивайте, не знаю почему). Поэтому я воспользовался сторонним MinGW -компилятором, скачанным из интернета (найдёте сами, если понадобится, не маленькие уже 🙂

Заходим в командную строку и набираем:

Эта команда добавит в path путь к папке bin вашего компилятора. Теперь идём в папку, куда вы распаковали архив с исходниками библиотеки и переходим в папку win32 . В этой папке находится makefile, который создан для упрощения сборки, его имя mingwin32.mak . Его нужно передать программе mingw32-make , чтобы она скомпилировала библиотеку. Делается это так:

После выполнения этой команды начнётся компиляция PDcurses , нужно немного подождать. После окончания компиляции в папке появятся два файла — pdcurses.a и panel.a , это статические библиотеки, предназначенные для компоновщика, они то нам и нужны.

Теперь мы должны перенести эти два файла в папку со статическими библиотеками вашего компилятора. Для Dev-Cpp это папка . \DevCpp\MinGW64\lib\ . Так же в папке, в которую вы распаковали PDcurses есть заголовочный файл curses.h . Его нужно перенести в папку с заголовочными файлами вашего компилятора. Для Dev-Cpp это папка . \Dev-Cpp\MinGW64\x86_64-w64-mingw32\include . Теперь PDcurses готова к использованию.

Тестирование PDcurses

Для проверки напишем программу, выводящую на экран «Hello, World!», начиная с координаты (5;5)

Для это создадим в Dev-Cpp проект Console Application (консольное приложение) и назовём его, к примеру, «curses».

Создадим файл main.cpp (можно называть как угодно) и напишем в нём:

Теперь нужно добавить библиотеку pdcurses.a . Для этого перейдём в Проект->Параметры проекта->Параметры->Добавить библиотеку . Выберем файл pdcurses.a из папки . \DevCpp\MinGW64\lib .

Пишем первую программу на Ncurses

Ncurses — это библиотека, предназначенная для управления вводом-выводом на терминал. Позволяет задавать экранные координаты и цвет выводимых символов. Это статья является переводом данного материала. Пишите в комментариях, если нашли ошибку или неточность в переводе.

Материал рассчитан в первую очередь, на пользователей Unix-подобных ОС. Тем не менее, для пользователей Windows есть клон библиотеки ncurses — PDcurses.

История

В стародавние времена все немногочисленные возможности терминалов (телетайп-терминалов) поддерживались с помощью последовательностей байт. Эти управляющие последовательности, обычно называемые escape -последовательностями, начинались со специального символа 0x1B . Отголоски того времени дошли и до нас. Сегодня мы можем сделать то же самое со своим терминалом (на самом деле с эмулятором терминала, но для краткости, здесь и далее, называемым терминалом), используя точно такую же технологию.

Рассмотрим пример. Допустим, вам захотелось написать строку «In color» красным цветом. Для этого напишем в терминале (работает только для UNIX-подобных систем!):

Читайте также:  Нормальный видеоплеер для windows

Первый символ является escape -символом («^[», догадайтесь сами какой HEX-код у этого символа). Чтобы набрать его в терминале нужно нажать CTRL+V , а затем ESC . Дальше набираете так, как есть.

Результат выполнения команды:

Тот же трюк можно провернуть и программно:

В С\C++ escape -символы задаются символом \ (к примеру, \n — переход на новую строку, \r — возврат каретки). Соответственно, чтобы загнать escape -символ 0×1B в поток, нужно вписать \x1B.

Представим, что вам захотелось в своей программе использовать различные цвета, чтобы программа выглядела красивее чем обычно. Не правда ли будет сложно запоминать значения каждых управляющих символов?

И к тому же, эти символы, скорее всего, различны для каждого типа терминала. Именно для того, чтобы избежать заучивания значения каждого символа, а также для написания кода, не зависящего от типа терминала, была придумана библиотека ncurses .

Что такое ncurses и с чем его едят?

ncurses — это клон оригинальной curses из System V Release 4.0 (SVr4), которая в свою очередь была улучшением классического curses из BSD (название произошло от «new curses»)

Но ncurses это не только обёртка над зависимыми от системы управляющими символами, это так же и хороший фреймворк для создания красивого пользовательского интерфейса в текстовом режиме. Библиотека содержит функции управления окнами и меню, а так же «библиотеку-сестру» panel , управляющую панелями.

Вот пример приложения, основанного на ncurses :

Разумеется, это не все возможности, предоставляемые этой библиотекой. По мере продвижения вперёд, мы увидим гораздо больше, не сомневайтесь 🙂

Установка ncurses

Установить ncurses очень просто. Для этого откроем терминал и напишем:

Всё. Библиотека установлена и теперь мы готовы писать код.

Привет, мир! (Hello world!)

Итак, добро пожаловать в мир ncurses . Перед погружением в библиотеку, напишем простую программу, которая скажет «Hello!» всему миру.

Чуть не забыл, чтобы компилировать программы, использующие библиотеку ncurses , нужно устанавливать флаг -lncurses :

Описание кода

ncurses.h

ncurses.h — заголовочный файл ncurses . В нём объявлены все функции и константы библиотек. Обязателен к подключению.

initscr()

Функция initscr() переводит терминал в curses -режим. Она чистит экран, выделяет память под необходимые данные для работы библиотеки, и инициализирует окно stdscr (об этом не сегодня, к сожалению). Вызов initscr() обязателен перед любым использованием ncurses . В некоторых случаях функция может завершиться неудачно, если не хватило памяти. Впрочем, такие ситуации маловероятны, учитывая ресурсы, предоставленные современным компьютерам и ресурсы, требуемые для нормальной работы библиотеки.

printw()

Функция printw() выполняет ту же роль что и printf() , и имеет точно такой же синтаксис. Почему используется именно printw() ? Потому что std::cout и printf() на работают в curses -режиме. В остальном эта функция полностью аналогична printf() . Для справки: ввод осуществляется при помощи функции scanw() (аналогично scanf() ).

refresh()

Функция printw() отправляет данные не напрямую на экран, а в так называемый буфер. Функция refresh() проверяет буфер и, если он не пуст, отправляет информацию на экран (обновляет только изменившиеся зоны экрана), она чем то схожа с flush() из stdio . Зачастую, её вызов не обязателен, но иногда без вызова этой функции можно получить странные ошибки.

getch()

Функция getch() , наверное, знакома всем по библиотеке conio.h . Так вот, это её полный аналог (даже чуть лучше, как мы увидим далее). Функция ожидает нажатие любой клавиши на клавиатуре и возвращает код этой самой клавиши.

endwin()

В конце не забывайте выйти из curses -режима, иначе, после завершения программы ваш терминал будет «странно» себя вести. Выходом из curses -режима занимается функция endwin() . Она очищает экран, освобождает память, которую выделяла initscr() и переводит терминал в нормальный режим (в тот, в котором он был до выполнения программы).

Оцените статью