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

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

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:
66:  SLsmg_refresh();
67:  SLang_getkey();
68:
69:  SLsmg_gotorc(SLtt_Screen_Rows - 1, 0);
70:  SLsmg_refresh();
71:  SLsmg_reset_smg();
72:  SLang_reset_tty();
73:
74:  return 0;
75: }

Оглавление книги


Генерация: 1.054. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз