Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 66

Автор НСйл ΠœΡΡ‚ΡŒΡŽ

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ wrefresh, wclear ΠΈ werase β€” просто обобщСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π²Ρ‹ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Π»ΠΈΡΡŒ Ρ€Π°Π½Π΅Π΅; ΠΎΠ½ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ WINDOW, поэтому ΠΌΠΎΠ³ΡƒΡ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ, Π° Π½Π΅ Π½Π° ΠΎΠΊΠ½ΠΎ stdscr.

Ѐункция touchwin довольно ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ. Она ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ curses ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ содСрТимоС ΠΎΠΊΠ½Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π΅Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, Π±Ρ‹Π»ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ curses всСгда Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΡΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ wrefresh, Π΄Π°ΠΆΠ΅ Ссли Π²Ρ‹ Π½Π° самом Π΄Π΅Π»Π΅ Π½Π΅ мСняли содСрТимоС этого ΠΎΠΊΠ½Π°. Π­Ρ‚Π° функция ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Π° для опрСдСлСния ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ…ΡΡ ΠΎΠΊΠΎΠ½, Π·Π°Π³Ρ€ΠΎΠΌΠΎΠΆΠ΄Π°ΡŽΡ‰ΠΈΡ… экран.

Π”Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ scroll ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΎΠΉ ΠΎΠΊΠ½Π°. Ѐункция scrollok ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ логичСского значСния true (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ) Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΡƒ ΠΎΠΊΠ½Π°. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠΊΠ½Π° Π½Π΅ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ. Ѐункция scroll просто ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΎΠΊΠ½ΠΎ Π½Π° ΠΎΠ΄Π½Ρƒ строку Π²Π²Π΅Ρ€Ρ…. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ curses Π²Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈ функция wsctl, которая Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ количСство строк для ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ числом. ΠœΡ‹ вСрнСмся ΠΊ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠ΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ·ΠΆΠ΅ Π² этой Π³Π»Π°Π²Π΅.

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 6.4.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 6.4. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ мноТСствСнными ΠΎΠΊΠ½Π°ΠΌΠΈ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, зная, ΠΊΠ°ΠΊ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ нСсколькими ΠΎΠΊΠ½Π°ΠΌΠΈ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ эти Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ multiw1.c. Для краткости ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ошибок Π½Π΅ приводится.

1. ΠšΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, Π²ΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌΠΈ отсортированныС объявлСния:

#include <unistd.h>

#include <stdlib.h>

#include <curses.h>


int main() {

 WINDOW *new_window_ptr;

 WINDOW *popup_windov_ptr;

 int x loop;

 int y_loop;

 char a_letter = 'a';

 initscr();

2. Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Π±Π°Π·ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ символами, обновляя физичСский экран, ΠΊΠΎΠ³Π΄Π° Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ логичСский экран:

 move(5, 5);

 printw("%s", "Testing multiple windows");

 refresh();

 for (y_loop = 0; y_loop < LINES - 1; y_loop++) {

  for (x_loop = 0; x_loop < COLS - 1; x_loop++) {

   mvwaddch(stdscr, y_loop, x_loop, a_letter);

   a_letter++;

   if (a_letter > 'z') a_letter = 'a';

  }

 }

 /* ОбновлСниС экрана */

 refresh();

 sleep(2);

3. Π’Π΅ΠΏΠ΅Ρ€ΡŒ создайтС ΠΎΠΊΠ½ΠΎ 10Γ—20 ΠΈ Π²ΡΡ‚Π°Π²ΡŒΡ‚Π΅ Π² Π½Π΅Π³ΠΎ тСкст ΠΏΠ΅Ρ€Π΅Π΄ прорисовкой ΠΎΠΊΠ½Π° Π½Π° экранС:

 new_window_ptr = newwin(10, 20, 5, 5);

 mvwprintw(new_window_ptr, 2, 2, "%s", "Hello World");

 mwwprintw(new_window_ptr, 5, 2, "%s",

  "Notice how very long lines wrap inside the window");

 wrefresh(new_window_ptr);

 sleep(2);

4. Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚Π΅ содСрТимоС Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°. Когда Π²Ρ‹ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ экран, ΠΎΠΊΠ½ΠΎ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ new_window_ptr, Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Ρ‚Π΅ΠΌΠ½Π΅Π½ΠΎ:

 a_letter = '0';

 for (y_lΠΎΠΎΡ€ = 0; y_lΠΎΠΎΡ€ < LINES - 1; y_lΠΎΠΎΡ€++) {

  for (Ρ…_lΠΎΠΎΡ€ = 0; xloop < COLS - 1; Ρ…_lΠΎΠΎΡ€++) {

   mvwaddch(stdscr, y_loop, Ρ…_lΠΎΠΎΡ€, a_letter);

   a_letter++;

   if (a_letter > '9') a_letter = '0';

  }

 }

 refresh();

 sleep(2);

5. Π•сли Π²Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Π²Ρ‹Π·ΠΎΠ² для обновлСния Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°, Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ измСнится, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‹ Π½Π΅ измСняли Π½ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ:

 wrefresh(new_window_ptr);

 sleep(2);

6. ΠΠΎ Ссли Π²Ρ‹ сначала Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ΡΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ touchwin ΠΈ заставитС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ curses Π΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠΊΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ wrefresh снова ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ Π½ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π½Π΅ΠΌ ΠΏΠ»Π°Π½Π΅.

 touchwin(new_window_ptr);

 wrefresh(new_window_ptr);

 sleep(2);

7. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ΡΡ ΠΎΠΊΠ½ΠΎ с Ρ€Π°ΠΌΠΊΠΎΠΉ Π²ΠΎΠΊΡ€ΡƒΠ³ Π½Π΅Π³ΠΎ.

 popup_window_ptr = newwin(10, 20, 8, 8);

 box(popup_window_ptr, '|', '-');

 mvwprintw(popup_window_ptr, 5, 2, "%s", "Pop Up Window!");

 wrefresh(popup_window_ptr);

 sleep(2);

8. ΠŸΠΎΠΈΠ³Ρ€Π°ΠΉΡ‚Π΅ с Π½ΠΎΠ²Ρ‹ΠΌΠΈ Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌΠΈ ΠΎΠΊΠ½Π°ΠΌΠΈ ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΡ… очисткой ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ΠΌ.

 touchwin(new_window_ptr);

 wrefresh(new_window_ptr);

 sleep(2);

 wclear(new_window_ptr);

 wrefresh(new_window_ptr);

 sleep(2);

 delwin(new_window_ptr);

 touchwin(popup_window_ptr);

 wrefresh(popup_window_ptr);

 sleep(2);

 delwin(popup_window_ptr);

 touchwin(stdscr);

 refresh();

 sleep(2);

 endwin();

 exit(EXIT_SUCCESS);

}

К соТалСнию, Π½Π΅Ρ‚ возмоТности ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этого Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° Π² ΠΊΠ½ΠΈΠ³Π΅, Π½ΠΎ Π½Π° рис. 6.4 ΠΏΠΎΠΊΠ°Π·Π°Π½ снимок экрана послС отобраТСния ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΎΠΊΠ½Π°.

Рис. 6.4


ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ Ρ„ΠΎΠ½ ΠΈ появится Π½ΠΎΠ²ΠΎΠ΅ Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ ΠΎΠΊΠ½ΠΎ, Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ экран, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π½Π° рис. 6.5.

Рис. 6.5


Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

ПослС ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° заполняСт стандартный экран Ρ†ΠΈΡ„Ρ€Π°ΠΌΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π»Π΅Π³Ρ‡Π΅ Π±Ρ‹Π»ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠΊΠ½Π°, вставляСмыС Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π½ΠΈΠΉ ΠΏΠ»Π°Π½. Π”Π°Π»Π΅Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π»ΠΎΠΆΠΈΡ‚ΡŒ Π½Π° Ρ„ΠΎΠ½ Π½ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ с Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ Π² Π½Π΅Π³ΠΎ тСкстом, Ρ€Π°Π·Π±ΠΈΡ‚Ρ‹ΠΌ Π½Π° строки Π² соотвСтствии с ΡˆΠΈΡ€ΠΈΠ½ΠΎΠΉ ΠΎΠΊΠ½Π°. Π”Π°Π»Π΅Π΅ Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΊΠ°ΠΊ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ touchwin Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ curses ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΊΠ½ΠΎ, Π΄Π°ΠΆΠ΅ Ссли Π² Π½Π΅ΠΌ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ мСнялось.

Π—Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ΠΌ curses ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ вставляСтся Π²Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ, ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ ΠΏΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° curses ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌΠΈΡΡ ΠΎΠΊΠ½Π°ΠΌΠΈ.

Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, ΠΏΡ€ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ ΠΎΠΊΠΎΠ½ слСдуСт Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π»ΠΈΡΡŒ Π² Π½ΡƒΠΆΠ½ΠΎΠΉ очСрСдности. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° curses Π½Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… свСдСний ΠΎΠ± ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ ΠΎΠΊΠΎΠ½, поэтому Ссли Π²Ρ‹ попроситС curses ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ нСсколько ΠΎΠΊΠΎΠ½, ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈΡ… ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠ΅ΠΉ придСтся Π²Π°ΠΌ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° curses ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π»Π° ΠΎΠΊΠ½Π° Π² Π½ΡƒΠΆΠ½ΠΎΠΌ порядкС, ΠΈΡ… слСдуСт ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ Π² этом порядкС. Один ΠΈΠ· способов Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ этого β€” ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ всС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π²Π°ΡˆΠΈΡ… ΠΎΠΊΠΎΠ½ Π² массивС ΠΈΠ»ΠΈ спискС, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… поддСрТиваСтся порядок ΠΈΡ… размСщСния, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ порядку ΠΈΡ… появлСния Π½Π° экранС.

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ экрана

Как Π²Ρ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΠ· упраТнСния 6.4, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ мноТСствСнных ΠΎΠΊΠΎΠ½ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ловкости, Π½ΠΎ Π½Π΅ слишком ΠΎΠ±Ρ€Π΅ΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ. Но ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Π°Ρ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, Ссли Π½ΡƒΠΆΠ΄Π°ΡŽΡ‰ΠΈΠΉΡΡ Π² ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ΅ сСтСвоС соСдинСниС. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Π² наши Π΄Π½ΠΈ с Π½Π΅ΠΉ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΎΡ‡Π΅Π½ΡŒ Ρ€Π΅Π΄ΠΊΠΎ, Π½ΠΎ Π΅Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Π»Π΅Π³ΠΊΠ°, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ рассмотрим Π΅Π΅ просто для ΠΏΠΎΠ»Π½ΠΎΡ‚Ρ‹ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Ρ‹.

Π—Π°Π΄Π°Ρ‡Π° состоит Π² ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ количСства символов, прорисовываСмых Π½Π° экранС, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹Ρ… Π»ΠΈΠ½ΠΈΠΉ связи рисованиС Π½Π° экранС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΡƒΡ‚ΠΎΠΌΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»Π³ΠΈΠΌ. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° curses ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ обновлСния экрана с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ wnoutrefresh ΠΈ doupdate:

#include <curses.h>

int wnoutrefresh(WINDOW *window_ptr);

int doupdate(void);

Ѐункция wnoutrefresh опрСдСляСт, ΠΊΠ°ΠΊΠΈΠ΅ символы Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π½Π° экран, Π½ΠΎ Π½Π΅ отправляСт ΠΈΡ… Π½Π° самом Π΄Π΅Π»Π΅. Ѐункция doupdate Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ отправляСт измСнСния Π½Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π». Если Π²Ρ‹ просто Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ wnoutrefresh, Π° Π·Π° Π½Π΅ΠΉ Ρ‚ΡƒΡ‚ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ doupdate, эффСкт Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ wrefresh. Однако Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ряд ΠΎΠΊΠΎΠ½, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ wnoutrefresh для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° (ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π² Π½ΡƒΠΆΠ½ΠΎΠΌ порядкС) ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ doupdate Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС послСднСго Π²Ρ‹Π·ΠΎΠ²Π° wnoutrefresh. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ curses Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ расчСты, связанныС с ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ экрана, ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС этого вывСсти ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΉ экран. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда позволяСт curses ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ количСство символов, Π½ΡƒΠΆΠ΄Π°ΡŽΡ‰ΠΈΡ…ΡΡ Π² пСрСсылкС.

Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΎΠΊΠ½Π°

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ рассмотрСли мноТСствСнныС ΠΎΠΊΠ½Π°, остановимся Π½Π° ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ случаС мноТСствСнных ΠΎΠΊΠΎΠ½, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΌ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΎΠΊΠ½Π°ΠΌΠΈ ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΎΠΊΠ½Π°ΠΌΠΈ. Π‘ΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°ΡŽΡ‚ΡΡ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΎΠΊΠ½Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²:

#include <curses.h>

WINDOW *subwin(WINDOW *parent, int num_of_lines, int num_of_cols,

 int start_y, int start_x);

int delwin(WINDOW *window_to_delete);

Π£ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ subwin ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ список ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΊΠ°ΠΊ Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ newwin, ΠΈ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΎΠΊΠ½Π° Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠΊΠ½Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° delwin. Для записи Π²ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΎΠΊΠ½Π°, ΠΊΠ°ΠΊ ΠΈ Π² Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠΊΠ½Π°, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ряд Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ mvw. На самом Π΄Π΅Π»Π΅ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΎΠΊΠ½Π° Π²Π΅Π΄ΡƒΡ‚ сСбя ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠΊΠ½Π°, Π½ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎ Π²Π°ΠΆΠ½ΠΎΠ΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅: ΠΏΠΎΠ΄ΠΎΠΊΠ½Π° ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ хранят ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ экранных символов; ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ‚Ρƒ ΠΆΠ΅ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ хранСния символов, Ρ‡Ρ‚ΠΎ ΠΈ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ΅ ΠΎΠΊΠ½ΠΎ, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΈ создании Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π»ΡŽΠ±Ρ‹Π΅ измСнСния, сдСланныС Π²ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΌ ΠΎΠΊΠ½Π΅, вносятся ΠΈ Π² Π»Π΅ΠΆΠ°Ρ‰Π΅Π΅ Π² основании Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ΅ ΠΎΠΊΠ½ΠΎ, поэтому, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ΄ΠΎΠΊΠ½ΠΎ удаляСтся, экран Π½Π΅ мСняСтся.

На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΎΠΊΠ½Π° каТутся бСсполСзным экспСримСнтом. ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ просто Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ΅ ΠΎΠΊΠ½ΠΎ? Основная сфСра ΠΈΡ… примСнСния β€” прСдоставлСниС простого способа ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°. ΠŸΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ Π² ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠ΅ нСбольшой области экрана ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ часто Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΈ написании ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ с использованиСм curses. Π‘ΠΎΠ·Π΄Π°Π² Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΈ прокручивая Π΅Π³ΠΎ, Π²Ρ‹ Π΄ΠΎΠ±ΡŒΠ΅Ρ‚Π΅ΡΡŒ ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°.