Чтение онлайн

на главную - закладки

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

void SLsmg_vprintf(char * format, va_list args);

void SLsmg_write_wrapped_string(char * str, int row, int column, int height,

int width, int fill);

Каждая из этих функций, за исключением

SLsmg_write_wrapped_string
, записывает требуемую строку в буфер экрана [170] в текущую позицию курсора, используя текущий цвет и набор символов. Однако все они по-разному определяют, какую строку необходимо записать. После того как информация будет записана, курсор переместится в конец выделенной для этого области, как и на обычном терминале. Любая строка, выходящая за пределы правого края экрана, усекается, а не переносится на другую строку. Хотя этот способ отличается от обычного вывода на терминал, он подходит
для большинства полноэкранных приложений, в которых текст, переводимый на новую строку, искажает содержимое экрана.

170

Помните, что обновление физического терминала производится только с помощью функции

SLsmg_refresh
.

SLsmg_write_char
Среди всех функций вывода данных на экран это самая простая функция. Она записывает передаваемый символ в текущую позицию курсора и перемещает курсор.
SLsmg_write_string
Выводит на экран передаваемую ей строку.
SLsmg_write_nchars
Выводит на экран символы
length
, на которые указывает
chars
. Символ конца строки
NULL
игнорируется — если он будет найден, выводится комбинация
'\0'
и подпрограмма продолжает работу после окончания строки.
SLsmg_write_nstring
Выводит на экран не более
length
символов из
str
. Если
str
содержит менее
length
символов, оставшееся пространство заполняется пробелами.
SLsmg_printf
Как можно судить из имени функции, она работает подобно стандартной функции
printf
, форматируя первый аргумент, а остальные аргументы используются в качестве параметров для форматирования. После этого на экран выводится сформатированная строка.
SLsmg_vprintf
Подобно функции
vfprintf
из библиотеки С. Эта функция ожидает получение аргумента
va_arg
, который она использует для форматирования первого параметра. Затем на экран выводится сформатированная строка.
SLsmg_write_wrapped_string
Хотя S-Lang отсекает строки, а не переносит их на следующие строки, она предлагает простую функцию для записи строк, перенесенных в произвольную прямоугольную область экрана. Функция
SLsmg_write_wrapped_string
записывает строку
str
в прямоугольную область, которая начинается в row и column и имеет размеры
height
и
width
. Несмотря на то что эта подпрограмма осуществляет перенос границ слов, последовательность
\n
указывает на необходимость перехода на следующую строку. Если последний параметр
fill
имеет ненулевое значение, то каждая строка будет заполнена по всей ширине прямоугольной области, а при необходимости будут добавляться пробелы.

24.2.8. Рисование линий и прямоугольников

Хотя функция

SLsmg_set_char_set
предлагает весь спектр функциональных возможностей, необходимых для рисования простой линейной графики на терминале, в библиотеке S-Lang для этого предусмотрено несколько простых функций.

void SLsmg_draw_hline(int row);

void SLsmg_draw_vline(int column);

void SLsmg_draw_box(int row, int column, int height, int width);

Функция

SLsmg_draw_hline
рисует одну горизонтальную линию в строке
row
, а функция
SLsmg_draw_vline
— одну вертикальную линию в колонке
col
.

Функция

SLsmg_draw_box
рисует прямоугольник, начиная с
row
и
col
, который простирается на
height
строк и
width
колонок. Функция
SLsmg_draw_box
подобна комбинации функций
SLsmg_draw_hline
и
SLsmg_draw_vline
, однако вдобавок она получает информацию о вершинах.

Далее представлен пример программы, которая рисует экран, отображающий обычный и альтернативный наборы символов. В программе также демонстрируется простое использование функции

SLsmg_draw_box
.

 1: /* slcharset.с */

 2:

 3: #include <slang/slang.h>

 4: #include <stdio.h>

 5: #include <sys/ioctl.h>

 6: #include <termios.h>

 7:

 8: /* отображает таблицу, содержащую 256 символов из одного набора символов,

 9: начиная со столбца col. Поверх таблицы отображается метка 'label',

10: а альтернативный набор символов будет отображаться в том случае,

11: если isAlternate будет иметь ненулевое значение */

12: static void drawCharSet(int col, int isAlternate, char * label) {

13: int i, j;

14: int n = 0;

15:

16: /* нарисовать прямоугольник */

17: SLsmg_draw_box(0, col, 20, 38);

18:

19: /* центрировать надпись */

20: SLsmg_gotorc(0, col + 2);

21: SLsmg_write_string(label);

22:

23:

24: /* нарисовать горизонтальную линию */

25: SLsmg_gotorc(2, col + 4);

26: SLsmg_write_string("0123456789ABCDEF");

27:

28: /* задать используемый набор символов */

29: SLsmg_set_char_set(isAlternate);

30:

31: /* итерация по 4 самым старшим битам */

32: for (i = 0; i < 16; i++) {

33: SLsmg_gotorc(3 + i, 2 + col);

34: SLsmg_write_char(i < 10 ? i + '0' : (i - 10) + 'A');

35:

36: /* итерация по 4 самым младшим битам */

37: for (j = 0; j < 16; j++) {

38: SLsmg_gotorc(3 + i, col + 4 + (j * 2));

39: SLsmg_write_char(n++);

40: }

41: }

42:

43: SLsmg_set_char_set(0);

44: }

45:

46: int main (void) {

47: struct winsize ws;

48:

49: /* получить размеры терминала, подключенного к stdout */

50: if (ioctl(1, TIOCGWINSZ, &ws)) {

51: perror("сбой при получении размеров окна");

52: return 1;

53: }

54:

55: SLtt_get_terminfо;

56:

57: SLtt_Screen_Rows = ws.ws_row;

58: SLtt_Screen_Cols = ws.ws_col;

59:

60: SLsmg_init_smg;

61: SLang_init_tty(-1, 0, 1);

62:

63: drawCharSet(0, 0, "Normal Character Set");

64: drawCharSet(40, 1, "Alternate Character Set");

65:

Поделиться:
Популярные книги

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Звездная Кровь. Изгой

Елисеев Алексей Станиславович
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой

Хозяин Теней 4

Петров Максим Николаевич
4. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 4

Картофельное счастье попаданки

Иконникова Ольга
Фантастика:
фэнтези
5.00
рейтинг книги
Картофельное счастье попаданки

Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Корнев Павел Николаевич
Фантастика:
фэнтези
героическая фантастика
5.50
рейтинг книги
Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Доктора вызывали? или Трудовые будни попаданки

Марей Соня
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Чехов. Книга 2

Гоблин (MeXXanik)
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Чехов. Книга 2

Хозяин Теней 2

Петров Максим Николаевич
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 2

Сумеречный стрелок 7

Карелин Сергей Витальевич
7. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный стрелок 7

Жизнь под чужим солнцем

Михалкова Елена Ивановна
Детективы:
прочие детективы
9.10
рейтинг книги
Жизнь под чужим солнцем

Красноармеец

Поселягин Владимир Геннадьевич
1. Красноармеец
Фантастика:
боевая фантастика
попаданцы
4.60
рейтинг книги
Красноармеец