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

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

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

Для опрСдСлСния Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΉ ΠΏΠ°Ρ€Ρ‹ Π½ΠΎΠΌΠ΅Ρ€ 1, ΠΊΠ°ΠΊ красный Π½Π° Π·Π΅Π»Π΅Π½ΠΎΠΌ, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строку:

init_pair(1, COLOR_RED, COLOR_GREEN);

Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ смоТСтС ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ этой Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΉ ΠΏΠ°Ρ€Π΅, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ

COLOR_PAIR
ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

wattron(window_ptr, COLOR_PAIR(1));

Она установит Π²Ρ‹Π²ΠΎΠ΄ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ Π½Π° экран красных символов Π½Π° Π·Π΅Π»Π΅Π½ΠΎΠΌ Ρ„ΠΎΠ½Π΅.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ

COLOR_PAIR
β€” это Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ. На ПК часто ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π½Π° экранС Ρ†Π²Π΅Ρ‚ΠΎΠ² ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½Π½ΠΎΠΉ яркости, объСдинив с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ поразрядной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ
OR
Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚
COLOR_PAIR
с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ
A_BOLD
:

wattron(window_ptr, COLOR_PAIR(1) | A_BOLD);

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ color.c (ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 6.7).

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 6.7. Π¦Π²Π΅Ρ‚Π°

1.Β Π‘Π½Π°Ρ‡Π°Π»Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π»ΠΈ Ρ†Π²Π΅Ρ‚Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π», ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ. Если Π΄Π°, Ρ‚ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ†Π²Π΅Ρ‚ΠΎΠ²:

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <curses.h>

int main() {

Β int i;

Β initscr();

Β if (!has_colors()) {

Β Β endwin();

Β  fprintf(stderr, "Error β€” no color support on this terminal\n");

Β Β exit(1);

Β }

Β if (start_color() != OK) {

Β Β endwin();

Β  fprintf(stderr, "Error β€” could not initialize colors\n");

Β Β exit(2);

Β }

2.Β Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ вывСсти допустимоС количСство Ρ†Π²Π΅Ρ‚ΠΎΠ² ΠΈ Ρ†Π²Π΅Ρ‚ΠΎΠ²Ρ‹Π΅ ΠΏΠ°Ρ€Ρ‹. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ сСмь Ρ†Π²Π΅Ρ‚ΠΎΠ²Ρ‹Ρ… ΠΏΠ°Ρ€ ΠΈ Π²Ρ‹Π²Π΅Π΄ΠΈΡ‚Π΅ ΠΈΡ… ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π½Π° экран:

Β clear();

Β mvprintw(5, 5, "There are %d COLORS, and %d COLOR_PAIRS available", COLORS, COLOR_PAIRS);

Β refresh();

Β init_pair(1, COLOR_RED, COLOR_BLACK);

Β init_pair(2, COLOR_RED, COLOR_GREEN);

Β init_pair(3, COLOR_GREEN, COLOR_RED);

Β init_pair(4, COLOR_YELLOW, COLOR_BLUE);

Β init_pair(5, COLOR_BLACK, COLOR_WHITE);

Β init_pair(6, COLOR_MAGENTA, COLOR_BLUE);

Β init_pair(7, COLOR_CYAN, COLOR_WHITE);

Β for (i = 1; i <= 7; i++) {

Β Β attroff(A_BOLD);

Β Β attrset(COLOR_PAIR(i));

Β Β mvprintw(5 + i, 5, "Color pair %d", i);

Β Β attrset(COLOR_PAIR(i) | A_BOLD);

Β Β mwprintw(5 + i, 25, "Bold color pair %d", i);

Β Β refresh();

Β Β sleep(1);

Β }

Β endwin();

Β exit(EXIT_SUCCESS);

}

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ Π½Π° рис. 6.7, Π·Π° Π²Ρ‹Ρ‡Π΅Ρ‚ΠΎΠΌ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ†Π²Π΅Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π½Π° Ρ‡Π΅Ρ€Π½ΠΎ-Π±Π΅Π»ΠΎΠΌ снимкС экрана.

ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² Linux - image018.jpg

Рис. 6.7

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

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

ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ†Π²Π΅Ρ‚ΠΎΠ²

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

init_color
:

<b>#include &lt;curses.h&gt;</b>

<b>int init_color(short color_number, short red, short green, short blue);</b>

Она позволяСт ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ†Π²Π΅Ρ‚ (Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ 0 Π΄ΠΎ

COLORS
) Π½ΠΎΠ²Ρ‹ΠΌΠΈ значСниями яркости Ρ†Π²Π΅Ρ‚Π° ΠΈΠ· Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΠΎΡ‚ 0 Π΄ΠΎ 1000. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ†Π²Π΅Ρ‚ΠΎΠ²Ρ‹Ρ… характСристик Π² графичСских Ρ„Π°ΠΉΠ»Π°Ρ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° GIF.

ПанСли 

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

Π­Ρ‚ΠΎ Π½Π΅Π»Π΅Π³ΠΊΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ curses, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π²Ρ‹ познакомились ΠΊ этому ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρƒ, Ρ‚.ΠΊ. всС ΠΎΠΊΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ большС физичСского экрана. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° curses прСдоставляСт ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ структуру Π΄Π°Π½Π½Ρ‹Ρ…, панСль (pad), для манипулирования Π΄Π°Π½Π½Ρ‹ΠΌΠΈ логичСского экрана, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡƒΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² стандартном ΠΎΠΊΠ½Π΅.

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΏΠ°Π½Π΅Π»ΠΈ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° структуру

WINDOW
, ΠΈ всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ curses, написанныС для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠΊΠ½Π°ΠΌΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈ ΠΊ панСлям. Но Ρƒ ΠΏΠ°Π½Π΅Π»Π΅ΠΉ Π΅ΡΡ‚ΡŒ ΠΈ собствСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для создания ΠΈ обновлСния.

ПанСли ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΎΠΊΠ½Π°.

<b>#include &lt;curses.h&gt;</b>

<b>WINDOW *newpad(int number_of_lines, int number_of_columns);</b>

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° структуру Ρ‚ΠΈΠΏΠ°

WINDOW
, Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅, ΠΊΠ°ΠΊ Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
newwin
. Π£Π΄Π°Π»ΡΡŽΡ‚ΡΡ ΠΏΠ°Π½Π΅Π»ΠΈ, ΠΊΠ°ΠΊ ΠΈ ΠΎΠΊΠ½Π°, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ
delwin
.

Но ΠΊ панСлям ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ обновлСния. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ панСль Π½Π΅ привязана ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅ экрана, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΏΠ°Π½Π΅Π»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π½Π° экран, ΠΈ Π΅Π΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° экранС. Π”Π΅Π»Π°ΠΉΡ‚Π΅ это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ prefresh.

<b>#include &lt;сurses.h&gt;</b>

<b>int prefresh(WINDOW *pad_ptr, int pad_row, int pad_column, int screen_row_min, int screen_col_min, int screen_row_max, int screen_соl_max);</b>