Ввод

Ввод символа
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). При вызове с нулевыми аргументами ф-ия создаст окно размером с экран.

Создание подокна
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>
Если вы используете 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.

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

Пример работы с панелями:

/*******************************************************
sample2.c - пример простой программы демонстрирующей
возможности панелей.
********************************************************/

#include <panel.h>

#define NLINES 10
#define NCOLS 40

void init_wins(WINDOW **wins, int n);

int main()
{	
    WINDOW *my_wins[3];
    PANEL  *my_panels[3];
    PANEL  *top;
    int ch;
    int i;

    /* инициализация ncurses */
    initscr();
    cbreak();
    noecho();
    keypad(stdscr, TRUE);

    /* инициализация цветовой палитры */
    if (!has_colors())
    {
	endwin();
	printf("\nОшибка! Не поддерживаются цвета\n");
	return 1;
    }
    start_color();
    init_pair(1, COLOR_RED, COLOR_BLUE);
    init_pair(2, COLOR_GREEN, COLOR_RED);
    init_pair(3, COLOR_BLUE, COLOR_GREEN);

    // инициализируются окна
    init_wins(my_wins, 3);
	
    // создание панелей на основе созданных окон
    my_panels[0] = new_panel(my_wins[0]);
    my_panels[1] = new_panel(my_wins[1]);
    my_panels[2] = new_panel(my_wins[2]);

    // устанавливаем указатели на следующее окно
    // для перехода при нажатии Tab на следующее окно
    set_panel_userptr(my_panels[0], my_panels[1]);
    set_panel_userptr(my_panels[1], my_panels[2]);
    set_panel_userptr(my_panels[2], my_panels[0]);

    // обновление и прорисовка
    update_panels();
    mvprintw(0, 0, "Tab - следующая панель F1 - Выход");
    doupdate();

    // т.к. панель с индексом 2 создавалась последней 
    // значит она и будет верхней
    top = my_panels[2];

    // цикл обработки сообщений с клавиатуры
    while((ch = getch()) != KEY_F(1))
    {	
    	switch(ch)
	{
	    case '\t': // переход на следующую панель
			top = (PANEL *)panel_userptr(top);
			top_panel(top);
			break;
        }
	
	// обновление и перерисовка
	update_panels();
	doupdate();
    }

    // уничтожение созданных панелей и окон
    for(i = 0; i < 3; ++i)
    {
	del_panel(my_panels[i]);
	delwin(my_wins[i]);
    }

    //завершение программы
    endwin();
    return 0;
}

// инициализируются окна
void init_wins(WINDOW **wins, int n)
{
    int x, y, i;

    y = 2;
    x = 10;

    for(i = 0; i < n; ++i)
    {
	wins[i] = newwin(NLINES, NCOLS, y, x);
	wbkgdset(wins[i], COLOR_PAIR(i+1));
	wclear(wins[i]);
	wrefresh(wins[i]);
		
	y += 3;
	x += 7;
    }
} 

Полезные ссылки

  1. ncsm.tar.tar (19Kb) - примеры программ использующих ncurses
  2. ftp://ftp.gnu.org/gnu/ncurses/ - Библиотека curses для Linux FreeBSD QNX Solaris
  3. http://www.pdcurses.sf.net - библиотека curses для DOS, Windows, OS/2 ...
  4. Иванов Н.Н. Программирование в Linux с нуля
  5. Разработка программного обеспечения для Linux. Инструментарий
  6. http://www.bloodshed.net/dev - среда разработки Dev-C++
  7. http://www.mingw.org/ - компилятор C/C++
(C) Copyright 2005-2006 Бердников Александр