|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Основные функции работы в текстовом режиме
Все функции управления экраном в текстовом режиме имеют свои прототипы в заголовочном файле CONIO.H. Там же находятся некоторые константы и макросы, используемые этими функциями. Большинство подпрограмм связано с окнами (windows), а не со всем экраном. Окно – это прямоугольная область экрана, которую программа использует для выдачи сообщений. Окно может занимать полный экран или быть настолько маленьким, что в него можно вывести только несколько символов. Borland C++ позволяет устанавливать размер и местоположение окон на экране. После того как вы задали окно, подпрограммы, которые манипулируют текстом, используют не весь экран, а только заданное окно. К примеру, clrscr() очищает активное окно, а не весь экран. Все координаты оказываются связанными с активным с активным окном. Для текстового экрана верхний левый угол окна имеет координаты (1,1). По умолчанию активным окном является весь экран. Функция, которая создает окно заданного размера и определенного местоположения, имеет прототип
void window (int left, int top, int right, int bottom);
Если какая-либо координата задана неверно, то никакого действия не происходит. Если выполнение функции было успешным, то все ссылки на текущие координаты делаются относительно этого окна. При создании окна с помощью функции window() координаты left, top, right, bottom являются абсолютными, т.е. рассматриваются относительно всего экрана. Поэтому вновь создаваемые окна могут перекрываться друг другом. Одной из наиболее употребимых функций является функция очистки активного окна
void clrscr(void);
Активное окно очищается, а курсор устанавливается в левом верхнем углу окна. Следующая функция – это функция позиционирования курсора. Её прототип –
void gotoxy(int x, int y);
здесь x и y – координаты относительно активного окна. Если какая-то из координат выходит за границы области, то никакого действия не происходит, однако ошибка также не фиксируется. Функции int wherex(); int wherey(); возвращают координаты x и y текущего положения курсора. Другая полезная функция – clreol(). Она очищает строку с текущей позиции курсора до правой границы окна. Особенно удобно с её помощью освобождать место для ввода. Прототип имеет вид
void clreol(void);
Следующие две функции уничтожают строку, в которой находится курсор, и вставляют пустую строку. Функция delline() с прототипом
void delline (void);
уничтожает строку, в которой находится курсор, а все строки, находящиеся под ней, поднимаются вверх. Функция
void insline (void);
вставляет пустую строку, а та строка, в которой находился курсор, и те строки, которые были ниже, опускаются на одну позицию. Функции ввода/вывода, такие, как printf(), не связаны с оконным интерфейсом, поэтому в Borland C++ дополнительно включены функции ввода/вывода, ориентированные на работу с использованием окон. Такими функциями являются:
Эти функции работают почти так же, как соответствующие функции printf(), gets(), puts(), за тем исключением, что связаны с активным окном. Кроме того эти функции не являются перенаправляемыми. Функция cputs() не переводит курсор на новую строку, а функция cprintf() не разбивает символ ’\n’ на ’\n\r’. Предположим, что установлен текущий видеорежим компьютера, который почти всегда следующий: текстовый режим 25 строк x 80 символов в строке. Существует несколько текстовых режимов. Установкой или заменой текстового режима управляет функция textmode() с прототипом
void textmode(int mode);
здесь аргумент mode может быть одной из следующих величин:
Современная техника в большинстве своем предполагает возможность выдачи текста в цвете. Можно определить как цвет текста, так и цвет фона. Однако использовать цвет могут только специальные, связанные с оконным интерфейсом функции. Такие функции, как printf(), для этого не предназначены. Функция textcolor() изменяет цвет выдаваемого текста. Её прототип имеет вид
void textcolor(int color);
Аргумент color может принимать значения от 0 до 15. каждое значение соответствует своему цвету. Кроме того, в файле CONIO.H определены макросы, соответствующие этим цветам. Они приведены ниже кроме того, textcolor() позволяет делать текст мигающим (blink):
Изменение цвета текста оказывает воздействие только на вновь вводимый текст. Текст, уже находящийся на экране, своего цвета не меняет. Для того чтобы сделать текст мигающим, надо применить побитовую операцию “OR” к цвету и величине BLINK. Например, чтобы выводить текст красными символами и так, чтобы они мигали, используем вызов функции
textcolor(RED|BLINK);
Функция textbackground() используется для установки цвета фона под вновь выводимым текстом. Прототип этой функции –
void textbackground(int color);
где величина color может принимать значения от нуля до шести, т.е. используются только первые 7 цветов из приведенной выше таблицы. Функция clrscr() не только очищает активное окно, но и заполняет его цвето, заданным в функции background().
ПРИМЕР: Использование функций работы с текстовым экраном. #include <conio.h> void main() { register int ctext, cblack; textmode(C80); for(ctext=BLUE; ctext<=WHITE; ctext++) { for (cblack=BLACK; cblack<=LIGHTGRAY; cblack++) { textcolor(ctext); textbackground(cblack); cprintf("ТЕКСТ"); } cprintf("\n"); } textcolor(WHITE|BLINK); textbackground(BLACK); cprintf("КОНЕЦ ТЕКСТА"); textmode(LASTMODE); }
Организация видеопамяти, т.е. участка памяти, который отображается на экране в случае работы с текстовым экраном, весьма проста. Каждому символу соответствует 2 байта. В одном из них хранится код символа, в другом – атрибут символа. Байт атрибута имеет следующий вид:
где СССС – 4-битовый двоичный код цвета символа; ФФФ – 3-битовый двоичный код цвета фона; В – признак мигания (1 – мигание включено, 0 - выключено). Так как для цвета фона выделено 3 бита, то цветов может быть только 8, а для цвета символа, задаваемого четырьмя битами – 16 цветов. Более того, как мы знаем из физики, любой цвет формируется смешением красного (R-red), зеленого (G-green) и голубого (B-blue) цветов. В байте атрибута можно указать, какой бит за какой цвет отвечает:
При этом 3-й бит отвечает за яркость цвета символа. Если мы будем рассматривать 4 последних бита, то 0001 соответствует цвету BLUE (1), в то время как 1001 соответствует цвету LIGHTBLUE (9). Соответственно 0000 – черный цвет (BLACK), 1111 – белый цвет (WHITE). Функция, которая позволяет задавать атрибут, имеет прототип
void textattr(int newattr);
Если нужно задать атрибут, соответствующий мигающему красному символу на черном фоне, это можно сделать следующими способами:
textattr((BLACK<<4) + RED + BLINK);
или
textattr(0x84);
Двоичная запись шестнадцатеричного числа 0х84 имеет вид 10000100. Сравните его с битами атрибута. Функция highvideo() устанавливает повышенную яркость символа, lowvideo() – стандартную яркость символа, normvideo() восстанавливает стандартные атрибуты (белые символы на черном фоне без мигания). Функция
void_setcursor type(int cursortype);
устанавливает размер курсора, значения параметра могут быть следующими:
NOCURSOR 0 курсор не виден; SOLIDCURSOR 1 курсор занимает все знакоместо; NORMALCURSOR 2 курсор имеет нормальный вид.
Переменная _wscroll управляет прокруткой окна. Если присвоить _wscroll значение, равное нулю прокрутка в окне запрещена, если же присвоить значение, равное единице, то прокрутка будет разрешена. В библиотеке предусмотрены функции, позволяющие сохранять, восстанавливать и перемещать содержимое части экрана. Этими функциями являются соответственно
int gettext(int left, int top, int right, int bottom, void * destin); int puttext(int left, int top, int right, int bottom, void * source); int movetext(int left, int top, int right, int bottom, int destleft, int desttop);
Область экрана задается координатами левого верхнего и правого нижнего углов, область памяти, в которую (из которой) переносится часть видеопамяти, задается указателями destin и source. В функции movetext() два последних аргумента указывают на координаты верхнего левого угла нового расположения области экрана. Так как для каждого символа видеопамяти отводится 2 байта, то при сохранении участка экрана надо предусмотреть буфер соответствующего размера.
ПРИМЕР: Использование gettext(), puttext.
#include <conio.h> void main() { char buffer[288],i; char str[]="This is a string! "; textbackground(BLACK); clrscr(); window(5, 5, 20, 10); textattr((GREEN<<4)+RED); clrscr(); cputs("\n Hello, World!\n\n\r"); textattr((GREEN<<4)+RED+BLINK); cputs("Press any key"); getch(); window(1, 1, 80, 25); gettext(4, 4, 21, 11, buffer); textbackground(BLUE); textcolor(WHITE); for (i=1; i<23; i++) { gotoxy(1, i); cputs(str); cputs(str); cputs(str); cputs(str); } getch(); puttext(24, 5, 41, 12, buffer); getch(); for (i=1; i<5; i++) movetext(22, 4, 32, 8, 10*i, 17); getch(); normvideo(); }
Переменная normvideo управляет тем, как выполняется вывод на консоль: непосредственно в оперативную память дисплея (normvideo = 1) либо направляется туда через вызов BIOS (normvideo = 0). По умолчанию значение normvideо = 1. Работа непосредственно с памятью дисплея ускоряет ввод, но для этого требуется 100 %-ная совместимость машины с IBM PC. Вывод через BIOS работает медленнее, но можно быть уверенным, что программа будет работать на любом IBM-совместимом компьютере.
Введение в графику Borland C++
Второй режим, который может устанавливаться – графический режим. Управление экраном в графическом режиме производится с помощью набора функций, прототипы которых находятся в заголовочном файле GRAPHICS.H. Там же объявлены константы и макросы. Файл GRAPHICS.H должен быть подключен с помощью директивы #include препроцессора языка С ко всем модулям, использующим графические подпрограммы. Так же как и в текстовом режиме, все графические функции оперируют окнами. В терминологии Borland C++ окно называется viewport. Отличие графического окна от текстового состоит в том, что левый верхний угол окна имеет координаты (0, 0) а не (1, 1). По умолчанию графическое окно занимает весь экран. Прежде чем использовать графические функции, необходимо установить видеоадаптер в графический режим. Для установки (инициализации) видеоадаптера служит функция initgraph(). Её прототип –
void far initgraph (int far * driver, int * far mode, char far * path);
В состав графического пакета входят заголовочный файл GRAPHICS.H, библиотечный файл GRAPHICS.LIB, драйверы графических устройств (*.BGI) и символьные шрифты (*.CHR). Функция initgraph() считывает в память соответствующий драйвер, устанавливает видеорежим, соответствующий аргументу mode, и определяет маршрут к директории, в которой находится соответствующий драйвер *.BGI. если маршрут не указан, то предполагается, что этот файл расположен в текущей директории. Заголовочный файл определяет макросы, соответствующие драйверам: DETECT EGA VGA
При использовании initgraph() можно указать или конкретный драйвер, или задать автоматическое определение (детектирование) типа видеоадаптера и выбора соответствующего драйвера уже во время выполнения программы (макрос DETECT). Это позволяет переносить без изменения программы на компьютеры с другими видеоадаптерами. Чтобы выйти из графического режима и вернуться в текстовый режим, необходимо использовать функции.
void far closegraph (void); и void far restorecrtmode (void);
Функция closegraph() используется, если программа дальше будет работать в текстовом режиме. Эта функция освобождает память, используемую графическими функциями, и устанавливает текстовый режим, который был до вызова функции initgraph(). Если программа завершает работу, то можно использовать функцию restorecrtmode(), которая устанавливает видеоадаптер в текстовый режим, который предшествовал первому вызову функции initgraph(). Как известно, графический экран представляет собой массив пикселей. Каждый пиксель соответствует одной точке на экране и может иметь свой цвет. Установить цвет пикселя в точке экрана с координатами (х, у) можно с помощью функции
void far putpixel (int x, int y, int color);
Основным “рисующими” функциями являются line() и circle(). Их прототипы –
void far line (int x, int y, int x1, int y1);
void far circle (int x, int y, int radius);
Функция line() чертит на экране прямую линию от точки с координатами (х, у) до точки с координатами (х1, у1) текущим цветом. Функция circle() рисует на экране окружность с центром в точке с координатами (х, у) и радиусом radius (единица измерения - пиксель) также текущим цветом. По умолчанию текущий цвет устанавливается WHITE. Изменить текущий цвет, т.е. цвет, которым рисуются линии, можно обратившись к функции setcolor() с прототипом –
void far setcolor (int color);
К другим “рисующим” функциям относятся
В качестве примера описания прототипа рассмотрим прототип функции rectangle()
void far rectangle (int left, int top, int right, int bottom);
Для закрашивания (заполнения) замкнутого контура служит функция floodfill(), которая закрашивает область заданным цветом по заданному шаблону. Её прототип –
void far floodfill (int x, int y, int bordecolor);
где х и у координаты точки внутри контура, bordecolor – цвет контура. Цвет и шаблон заполнения устанавливаются функцией
void far setfillstyle (int pattern, int color);
Вид шаблона закрашивания и соответствующие ему макрос и значение (pattern) приведены ниже:
Есть также набор функций, которые чертят контур и закрашивают область внутри контура:
Прототипы этих функций, их применение и особенности использования можно посмотреть с помощью HELP-системы оболочки Borland C++. Создать графическое окно можно используя функцию setviewport(). Её прототип –
void far setviewport (int left, int top, int right, int bottom, int flag);
параметры left, top, right и bottom задают местоположение и размер окна в абсолютных координатах, т.е. координатах экрана. Параметр flag устанавливает режим выхода за границу окна. Если flag не нулевой, то происходит автоматическое прерывание выдачи при выходе за границу окна. И в том и в другом случае ошибка не фиксируется. Для работы с экраном, окнами и образами (image) служат следующие функции:
Функция cleardevice() очищает весь экран, устанавливает текущей точкой левый верхний угол экрана, но оставляет неизменными все установки графического экрана: стиль линии, текущий цвет и т.д. Функция clearviewport() очищает текущее окно и устанавливает текущую точку в левый верхний угол окна. Для создания движения образа по заданному шаблону на экране служат функции getimage(),imagesize() и putimage(): с помощью функции getimage() взять часть экранного образа, вызвать imagesize() для определения размера памяти, необходимой для хранения этого образа, а затем вернуть его на экран в любую желаемую позицию с помощью функции putimage(). Наконец, для осуществления вывода текста в графическом режиме на экран используются функции
Пример: #include <graphics.h> #include <stdio.h> #include <stdlib.h> #include <conio.h>
int main() { int gdriver = DETECT, gmode, errorcode;
/* Инициализация графического режима */ initgraph(&gdriver, &gmode, "C:/C/BGI/");
errorcode = graphresult();
if (errorcode!= grOk) /* Проверка на ошибки */ { printf("Graphics error: %s\n", grapherrormsg(errorcode)); printf("Press any key to halt:"); getch(); return 1; }
/* Цикл для прорисовки линий */ randomize(); do { setcolor(random(16)); line(random(getmaxx()), random(getmaxy()), random(getmaxx()), random(getmaxy())); } while(!kbhit());
getch(); closegraph(); return 0; } Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.031 сек.) |