Новые проклятия для С-кодеров под Linux Иван Скляров Xakep, номер #058, стр. 058-086-3 В функции main() мы определяем строку, которую будем выводить в окне. Описываем my_win, как указатель на структуру WINDOW. Эта структура хранит высоту, ширину, позицию окна и его контекст. Любое новое окно в программе должно быть инициализировано с помощью WINDOW*. Stdscr и curscr тоже получают указатели на WINDOW, но это происходит автоматически, после выполнения initscr(). Функция initscr() является входом в ncurses. Также имеется функция, завершающая работу ncurses - endwin(). Она освобождает память, выделенную под ncurses, и восстанавливает режимы терминала, которые были до вызова initscr(). Вызывать initscr() и endwin() в программе можно сколько угодно раз. Но когда ncurses активна, то категорически не рекомендуется пользоваться функциями стандартной библиотеки I/O, типа printf, scanf и пр. Используй только функции библиотеки ncurses, иначе можно столкнуться с ошибками вывода на экране. Следующий блок инициализирует цвета, которые мы будем использовать в программе. Вызовом функции start_color() мы оповещаем систему о том, что собираемся использовать цвета (без этого вызова система о нашем желании не узнает). Затем с помощью has_colors() выясняем, способен ли терминал выводить цвета. Так, например, BSD-системы не дружат с цветами. Если такая возможность есть, то мы определяем цветовую пару (с помощью init_pair), которую будем использовать в дальнейшем. Пара представляет собой foreground и background-цвета (голубой и красный в нашем случае). Список всех восьми цветов, которые можно использовать на терминалах с цветовой поддержкой, можно найти в man init_pair в подразделе Colors. Число в функции init_pair (у нас - 1) является идентификатором цветовой пары, т.е. если в дальнейшем мы захотим использовать эту пару, то к ней достаточно будет обратиться по этому номеру (с помощью специального атрибута COLOR_PAIR(n)). Цветовых пар можно инициализировать любое количество, и все они должны иметь разные номера. С помощью функции newwin мы создаем окно. Newwin имеет следующий формат: WINDOW *newwin(int nlines, int ncols, int begin_y, int begin_x); begin_y и begin_x - координаты верхнего левого угла. nlines и ncols - число линий и колонок нового окна. Существует еще функция subwin для создания подокон, что бывает полезно в некоторых случаях. Далее с помощью нехитрых вычислений мы определяем координаты окна так, чтобы оно выводилось в середине экрана. Но если WHEIGHT и WWIDTH мы установили в начале программы, то откуда взялись переменные LINES и COLS? Дело в том, что функция initscr(), кроме всего прочего, инициализирует эти две переменные, устанавливая в них значения числа строк и столбцов терминала. Функция box(win, vert, hor) очерчивает указанное окно. В нашей программе окно по вертикали и горизонтали очерчивается звездочками - '*'. Если вместо символов указать нули, то окно будет обрамлено прямыми линиями. Существуют и другие аналогичные функции, например, border/wborder. Более подробно о них можно узнать в man. |