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

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

Жанры

Разработка приложений в среде 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:

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

Усадьба леди Анны

Ром Полина
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Усадьба леди Анны

Чужая дочь

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Чужая дочь

Светлая тьма. Советник

Шмаков Алексей Семенович
6. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Светлая тьма. Советник

Двойник Короля

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

Его нежеланная истинная

Кушкина Милена
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Его нежеланная истинная

Последний Паладин. Том 2

Саваровский Роман
2. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 2

Измена. Наследник для дракона

Солт Елена
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Измена. Наследник для дракона

Идеальный мир для Лекаря 9

Сапфир Олег
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Идеальный мир для Лекаря 9

Мастер темных Арканов

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

Адвокат империи

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

Кодекс Охотника. Книга XXI

Винокуров Юрий
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXI

Вечный. Книга II

Рокотов Алексей
2. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга II

Законы Рода. Том 3

Flow Ascold
3. Граф Берестьев
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 3

Наследник

Шимохин Дмитрий
1. Старицкий
Приключения:
исторические приключения
5.00
рейтинг книги
Наследник