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

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

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

ΠšΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π½Ρ‹ΠΉ Π²Π²ΠΎΠ΄

Π§Ρ‚Π΅Π½ΠΈΠ΅ с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ β€” ΠΎΡ‡Π΅Π½ΡŒ простая опСрация. К основным функциям чтСния относятся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅:

#include <curses.h>

int getch(void);

int getstr(char *string);

int getnstr(char *string, int number_of_characters);

int scanw(char *format, ...);

ВсС ΠΎΠ½ΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ своим Π°Π½Π°Π»ΠΎΠ³Π°ΠΌ, Π½Π΅ входящим Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ curses, getchar, gets ΠΈ scanf. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getstr Π½Π΅Ρ‚ возмоТности ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ Π΄Π»ΠΈΠ½Ρƒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠΉ строки, поэтому ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π΅ слСдуСт с большой ΠΎΡΡ‚ΠΎΡ€ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ. Если ваша вСрсия Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ curses ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ getnstr, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΡƒΡŽ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ количСство считываСмых символов, всСгда примСняйтС Π΅Π΅ вмСсто Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getstr. Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ gets ΠΈ fgets, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π²Ρ‹ познакомились Π² Π³Π»Π°Π²Π΅ 3.

Π’ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΈ 6.3 для дСмонстрации управлСния ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ipmode.c.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 6.3. Π Π΅ΠΆΠΈΠΌ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ ΠΈ Π²Π²ΠΎΠ΄

1. ΠΠ°Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π² Π½Π΅Π΅ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ curses:

#include <unistd.h>

#include <stdlib.h>

#include <curses.h>

#include <string.h>

#define PW_LEN 256

#define NAME_LEN 256


int main() {

 char name[NAME_LEN];

 char password[PW_LEN];

 const char *real_password = "xyzzy";

 int i = 0;

 initscr();

 move(5, 10);

 printw("%s", "Please login:");

 move(7, 10);

 printw("%s", "User name: ");

 getstr(name);

 move(9, 10);

 printw("%s", "Password: ");

 refresh();

2. ΠšΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π²ΠΎΠ΄ΠΈΡ‚ свой ΠΏΠ°Ρ€ΠΎΠ»ΡŒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ символов Π½Π° экранС. Π”Π°Π»Π΅Π΅ сравнитС Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ со строкой xyzzy:

 cbreak();

 noecho();

 memset(password, '\0', sizeof(password));

 while (i < PW_LEN) {

  password[i] = getch();

  if (password[i] == '\n') break;

  move(8, 20 + i);

  addch('*');

  refresh();

  i++;

 }

3. Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ восстановитС ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ символов ΠΈ Π²Ρ‹Π²Π΅Π΄ΠΈΡ‚Π΅ сообщСниС ΠΎΠ± ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ ΠΈΠ»ΠΈ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ:

 echo();

 nocbreak();

 move(11, 10);

 if (strncmp(real_password, password, strlen(real_password)) == 0)

   printw("%s", "Correct");

 else printw("%s", "Wrong");

 printw("%s", " password");

 refresh();

 sleep(2);

 endwin();

 exit(EXIT_SUCCESS);

}

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

ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ² ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π° ΠΈ установив Ρ€Π΅ΠΆΠΈΠΌ cbreak, Π²Ρ‹ выдСляСтС ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти, Π³ΠΎΡ‚ΠΎΠ²ΡƒΡŽ ΠΊ ΠΏΡ€ΠΈΠ΅ΠΌΡƒ пароля. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ символ пароля Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ обрабатываСтся, ΠΈ Π½Π° экран выводится * Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ курсора. Π’Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ экран ΠΈ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strcmp Π΄Π²Π΅ строки: Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΈ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ€ΠΎΠ»ΠΈ.

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

Если Π²Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ΡΡŒ ΠΎΡ‡Π΅Π½ΡŒ старой вСрсиСй Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ curses, Π²Π°ΠΌ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, понадобится Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ refresh ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getstr. Π’ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ ncurses Π²Ρ‹Π·ΠΎΠ² getstr обновляСт экран автоматичСски.

Окна

Π”ΠΎ сих ΠΏΠΎΡ€ Π²Ρ‹ использовали Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» ΠΊΠ°ΠΊ срСдство полноэкранного Π²Ρ‹Π²ΠΎΠ΄Π°. Π­Ρ‚ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для ΠΌΠ°Π»Π΅Π½ΡŒΠΊΠΈΡ… простых ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Π½ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° curses ΠΈΠ΄Π΅Ρ‚ Π³ΠΎΡ€Π°Π·Π΄ΠΎ дальшС. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π° физичСском экранС ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ мноТСство ΠΎΠΊΠΎΠ½ Ρ€Π°Π·Π½Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ². МногиС ΠΈΠ· описанных Π² этом Ρ€Π°Π·Π΄Π΅Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… стандарта X/Open Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ "Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠΉ" вСрсиСй curses. Но ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ ncurses, Π½Π΅ Π²Π΅Π»ΠΈΠΊΠ° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΡ… доступными Π½Π° Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ. ΠŸΠΎΡ€Π° ΠΈΠ΄Ρ‚ΠΈ дальшС ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ мноТСствСнныС ΠΎΠΊΠ½Π°. Π’Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΊΠ°ΠΊ ΠΎΠ±ΠΎΠ±Ρ‰Π°ΡŽΡ‚ΡΡ Π΄ΠΎ сих ΠΏΠΎΡ€ использовавшиСся ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π² сцСнариях с мноТСствСнными ΠΎΠΊΠ½Π°ΠΌΠΈ.

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° WINDOW

НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΈ стандартный экран stdscr, ΠΏΠΎΠΊΠ° Ρƒ вас Π½Π΅ Π±Ρ‹Π»ΠΎ нСобходимости Π² Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΡ‡Ρ‚ΠΈ всС рассматриваСмыС Π΄ΠΎ сих ΠΏΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠ»Π°Π³Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π° экранС stdscr, ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€.

stdscr β€” это ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ случай структуры WINDOW, ΠΊΠ°ΠΊ stdout β€” ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ случай Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ структура WINDOW ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ Π² Ρ„Π°ΠΉΠ»Π΅ curses.h ΠΈ, нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΅Π΅ просмотр ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡƒΡ‡ΠΈΡ‚Π΅Π»Π΅Π½, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ эту структуру Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Ρ‚.ΠΊ. ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ Π² Ρ€Π°Π·Π½Ρ‹Ρ… рСализациях.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠΈΡ‚ΡŒ ΠΎΠΊΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ newwin ΠΈ delwin:

#include <curses.h>

WINDOW *newwin(int num_of_lines, int num_of_cols, int start_y, int start_x);

int delwin(WINDOW *window_to_delete);

Ѐункция newwin создаСт Π½ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ экрана (start_y, int start_x) ΠΈ с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ. количСством строк ΠΈ столбцов. Она Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΈΠ»ΠΈ NULL, Ссли ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠΊΠ½ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π°Π²Ρ‹ΠΉ Π½ΠΈΠΆΠ½ΠΈΠΉ ΡƒΠ³ΠΎΠ» Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° совпадал с ΠΏΡ€Π°Π²Ρ‹ΠΌ Π½ΠΈΠΆΠ½ΠΈΠΌ ΡƒΠ³Π»ΠΎΠΌ экрана, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ количСство строк ΠΈ столбцов. ВсС ΠΎΠΊΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… экрана. Ѐункция newwin Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ, Ссли какая-Π»ΠΈΠ±ΠΎ Ρ‡Π°ΡΡ‚ΡŒ ΠΎΠΊΠ½Π° окаТСтся Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ экрана. НовоС ΠΎΠΊΠ½ΠΎ, созданноС newwin, Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ нСзависимо ΠΎΡ‚ всСх ΡƒΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ…ΡΡ ΠΎΠΊΠΎΠ½. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠ½ΠΎ помСщаСтся ΠΏΠΎΠ²Π΅Ρ€Ρ… ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠΊΠΎΠ½, скрывая (Π½ΠΎ Π½Π΅ измСняя) ΠΈΡ… содСрТимоС.

Ѐункция delwin удаляСт ΠΎΠΊΠ½ΠΎ, созданноС Ρ€Π°Π½Π΅Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ newwin. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ newwin, ΠΏΠΎ всСй вСроятности, выдСляСтся ΠΏΠ°ΠΌΡΡ‚ΡŒ, слСдуСт всСгда ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ ΠΎΠΊΠ½Π°, ΠΊΠΎΠ³Π΄Π° Π² Π½ΠΈΡ… большС Π½Π΅Ρ‚ Π½ΡƒΠΆΠ΄Ρ‹.

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

Π‘Π»Π΅Π΄ΠΈΡ‚Π΅ Π·Π° Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ собствСнныС ΠΎΠΊΠ½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ curses: stdscr ΠΈ curscr!

Когда Π½ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ создано, ΠΊΠ°ΠΊ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Π½Π΅Π³ΠΎ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ? Π£ всСх ΡƒΠΆΠ΅ рассмотрСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π΅ΡΡ‚ΡŒ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Π΅ вСрсии, Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π² Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠΊΠ½Π°Ρ…, ΠΈ для удобства Π² Π½ΠΈΡ… Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ курсора.

Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π’Ρ‹ ΡƒΠΆΠ΅ примСняли Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ addch ΠΈ printw для вставки символов Π½Π° экран. К этим функциям, ΠΊΠ°ΠΊ ΠΈ ΠΊΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ прСфикс Π»ΠΈΠ±ΠΎ w для ΠΎΠΊΠ½Π°, Π»ΠΈΠ±ΠΎ mv для пСрСмСщСния курсора, Π»ΠΈΠ±ΠΎ mvw для пСрСмСщСния ΠΈ ΠΎΠΊΠ½Π°. Если Π²Ρ‹ посмотритС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° вСрсий Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ curses, Ρ‚ΠΎ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ²ΡˆΠΈΠ΅ΡΡ Π΄ΠΎ сих ΠΏΠΎΡ€, β€” простыС макросы (#defines), Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ эти Π±ΠΎΠ»Π΅Π΅ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Когда добавляСтся прСфикс w, Π² Π½Π°Ρ‡Π°Π»ΠΎ списка Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ вставлСн ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ‚ΠΈΠΏΠ° WINDOW. Когда добавляСтся прСфикс mv, Π² Π½Π°Ρ‡Π°Π»ΠΎ списка Π½ΡƒΠΆΠ½ΠΎ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΄Π²Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ y ΠΈ Ρ…. Они Π·Π°Π΄Π°ΡŽΡ‚ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π½Π° экранС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ выполняСтся опСрация, Ρƒ ΠΈ Ρ… β€” ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΎΠΊΠ½Π°, Ρ‚ΠΎΡ‡ΠΊΠ° (0, 0) находится Π² Π»Π΅Π²ΠΎΠΌ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΡƒΠ³Π»Ρƒ ΠΎΠΊΠ½Π°, Π° Π½Π΅ экрана.

Когда добавляСтся прСфикс mvw, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ‚Ρ€ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°: ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ WINDOW ΠΈ значСния Ρƒ ΠΈ Ρ…. Как Π½ΠΈ странно, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ WINDOW всСгда Π² спискС ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΠ΅Ρ‚ экранным ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌ, нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ, судя ΠΏΠΎ прСфиксу, Ρƒ ΠΈ Ρ… Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌΠΈ.

Π”Π°Π»Π΅Π΅ для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠΎΠ² для сСмСйств Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ addch ΠΈ printw.

#include <curses.h>

int addch(const chtype char);

int waddch(WINDOW *window_pointer, const chtype char);

int mvaddch(int y, int x, const chtype char);

int mvwaddch(WINDOW *window_pointer, int y, int x, const chtype char);

int printw(char *format, ...);

int wprintw(WINDOW *window_pointer, char *format, ...);

int mvprintw(int y, int x, char *format, ...);

int mvwprintw(WINDOW *window_pointer, int y, int x, char *format, ...);

Π£ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ inch, Ρ‚Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΎΠΊΠΎΠ½Π½Ρ‹Π΅ ΠΈ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ΠΌ курсора.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΎΠΊΠ½Π°

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ позволят Π²Π°ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΈ ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΡΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠΊΠ½Π°:

#include <curses.h>

int mvwin(WINDOW *window_to move, int new_y, int new x);

int wrefresh(WINDOW *window_ptr);

int wclear(WINDOW *window_ptr);

int werase(WINDOW *window_ptr);

int touchwin(WINDOW *window_ptr);

int scrollok(WINDOW *window_ptr, bool scroll_flag);

int scroll(WINDOW *window_ptr);

Ѐункция mvwin ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ ΠΎΠΊΠ½ΠΎ ΠΏΠΎ экрану. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠΊΠ½ΠΎ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π² области экрана, функция mvwin Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ, Ссли Π²Ρ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠΊΠ½ΠΎ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ какая-Ρ‚ΠΎ Π΅Π³ΠΎ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ‹ΠΉΠ΄Π΅Ρ‚ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ экрана.