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

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

Жанры

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

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

Возвышение Меркурия. Книга 2

Кронос Александр
2. Меркурий
Фантастика:
фэнтези
5.00
рейтинг книги
Возвышение Меркурия. Книга 2

Безымянный раб

Зыков Виталий Валерьевич
1. Дорога домой
Фантастика:
фэнтези
9.31
рейтинг книги
Безымянный раб

Волк 4: Лихие 90-е

Киров Никита
4. Волков
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Волк 4: Лихие 90-е

Кремлевские звезды

Ромов Дмитрий
6. Цеховик
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кремлевские звезды

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

Володин Григорий
4. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 4

Восход. Солнцев. Книга VIII

Скабер Артемий
8. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга VIII

Кровь и Пламя

Михайлов Дем Алексеевич
7. Изгой
Фантастика:
фэнтези
8.95
рейтинг книги
Кровь и Пламя

Объединитель

Астахов Евгений Евгеньевич
8. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Объединитель

Комбинация

Ланцов Михаил Алексеевич
2. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Комбинация

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

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

Дайте поспать!

Матисов Павел
1. Вечный Сон
Фантастика:
юмористическое фэнтези
постапокалипсис
рпг
5.00
рейтинг книги
Дайте поспать!

Бальмануг. Студентка

Лашина Полина
2. Мир Десяти
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Бальмануг. Студентка

Довлатов. Сонный лекарь

Голд Джон
1. Не вывожу
Фантастика:
альтернативная история
аниме
5.00
рейтинг книги
Довлатов. Сонный лекарь

Мастер Разума VII

Кронос Александр
7. Мастер Разума
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер Разума VII