Управление экраном и памятью в текстовом режиме

В текстовом режиме можно управлять размерами активного окна, курсором, цветом фона и цветом текста. К функциям управления экраном относятся функции задания и очистки экрана, управления курсором и управление цветом. Функции задания окна и его очистки были приведены в первой главе. Это функции window() и clrscr().

Следующая функция – это функция позиционирования курсора в пределах активного окна. Ее прототип

void gotoxy(int x, int y);

здесь x и y – координаты относительно активного окна.

Функции

int wehrex(); int wehrey();

возвращают координаты x и y текущего положения курсора.

Установкой или заменой текстового режима управляет функция textmode() с прототипом

int textmode(int mode);

здесь аргумент mode задает режим печати, а именно количество строк на экране, количество символов в строке и цвет. Он может быть задан в виде макроса или в виде числового эквивалента [2].

Современная техника позволяет выводить текст в цвете. Можно определить как цвет текста, так и цвет фона. Однако использовать цвет могут только специальные функции, связанные с оконным интерфейсом. Такие функции как printf() для этого не предназначены.

Для изменения цвета текста предназначена функция textcolor(). Ее прототип

void textcolor(int color);

Аргумент color может принимать значения от 0 до 15. Каждому значению соответствует свой цвет. (Число может быть заменено соответствующим макросом). Кроме того, textcolor() позволяет делать цвет мигающим (blink). Код этого аргумента - 128. Для того, чтобы сделать цвет мигающим надо применить побитовую операцию “OR” к цвету и величине BLINK. Например, для вывода текста красным мигающим цветом надо применить функцию

textcolor( RED|BLIK).

Изменение цвета текста оказывает действие только на вновь выводимый текст и не оказывает никакого действия на ранее введенный текст.

Для установки цвета фона используется функция

void textbackground(int color);

Здесь аргумент color имеет те же значения, что и в функции textcolor().

Функция clrscr() не только очищает активное окно, но и заполняет его цветом, заданным в функции background().

Пример 9.2.Использование функций работы с текстом.

# include <conio.h>

main(void)

{

register int ctext< cback;

textmode(C80); /* 40 символов, 25 строк, цветовой */

for(ctext = BLUE; ctext<=WHITE; ctext++)

{

for(cback = BLACK; cback<=LIGHTGRAY; cback++)

{

textcolor(ctext);

textbackground(cback);

cprintf(“ТЕКСТ”);

}

cprintf(“\n”);

}

textcolor(WHITE|BLINK);

textbackground(BLACK);

cprintf(“КОНЕЦ ТЕКСТ”);

textmode(LASTMODE);

RETURN(0);

}

Организация видеопамяти при работе с текстом следующая. Каждому символу соответствует 2 байта. В одном из них хранится код символа, в другом - атрибут символа. Байт атрибута имеет следующий вид:



В Ф Ф Ф С С С С

где СССС-4 битовый двоичный код символа; ФФФ – 3-битовый двоичный код фона; В – признак мигания(1 – мигание включено,0- выключено).

Так как для цвета фона выделено 3 бита, то цветов фона может быть только 8, а для цветов символа, задаваемого четырьмя битами – 16 цветов.

Более того, любой цвет формируется смешением красного (R-red), зеленого (G-green) и голубого (B-blue) цветов. В байте атрибута мы можем указать, какой бит за какой цвет отвечает:

В R G B С R G B

При этом третий бит отвечает за яркость цвета символа. Если мы будем рассматривать последние 3 бита, то комбинация 0001 будет соответствовать цвету BLUE (1), в то время как 1001 будет соответствовать цвету LIGHTBLUE (9). Соответственно 0000- черный цвет (0). 1111- белый цвет (15).

Функция, которая позволяет задавать атрибут, имеет прототип

void textattr(int newattr);

Например, задать атрибут, соответствующий красному символу на черном фоне, можно следующими способами:

textattr(( BLACK<<4)+ RED+ BLINK );

или textattr(0x80);

Двоичная запись шестнадцатеричного числа 0х80 имеет вид 10000100. Сравните его с битами атрибута.

В библиотеке предусмотрены функции, позволяющие сохранять, восстанавливать и перемещать содержимое части экрана. Этими функциями являются соответственно

int gettext(int left,int top,int right, int bottom, void*destin);

int puttext(int left,int top,int right, int bottom, void*sourse);

int movetext(int left,int top,int right, int bottom, int destleft, int desttop);

Область экрана задается координатами левого верхнего и правого нижнего углов, область памяти, в которую (или из которой) переносится часть видеопамяти, задается указателями destin и sourse. В функции movetext() два последних аргумента указывают на координаты верхнего левого угла нового расположения экрана. Так как для каждого символа отводится два байта памяти, то при сохранении участка экрана надо предусмотреть буфер соответствующего размера.

Все прототипы функций хранятся в заголовочном файле CONIO.H

Наши рекомендации