Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Информация о текстовом режиме

Поиск

void gettextinfo ( struct text_info *ptr);

Структура text_info определена в файле conio.h и имеет вид:

struct text_info{

unsigned char winleft, wintop, winright, winbottom; //Текущее окно

unsigned char attribute, normattr; //Текущий атрибут

unsigned char currmode; //Текстовый режим

unsigned char screenheight, screenwidth; // Размеры экрана

unsigned char curx, cury; // Координаты курсора в окне

}

Пример

Формирование окон сообщений, подсказок, полей ввода.

Набор функций:

- message - вывод сообщений,

- status - вывод подсказок,

- diagnos - вывод диагностических сообщений,

- vvod - формирование полей ввода,

- out_text - вывод строки в окно,

- init_window - инициализировать окно,

- clear_window - очистить окно,

- ramka - нарисовать рамку окна.

 

/*****************************/

/* MESSAGE */

/* Вывести сообщение */

/*****************************/

#include <conio.h>

#include <dos.h>

#define EKRAN BLACK

#define LAG 3 // Задержка(сек)

void message( int nom, // N сообщения

int reg){ // режим: FULL=1-вывод, CLEAR=0-очистить окно

static struct mes{

int beg_x, // Коорди-

beg_y, // наты

end_x, // ок-

end_y, // на

char regim; // r-разрядка, p-плотный

char *text; // Текст сообщения

}def[ ]={ // Описание сообщений

28,2,52,4,'r',"ВВОД ДАННЫХ",

19,12,61,14,'p',"Имя файла входных данных",

.........................................

19,12,61,14,'r',"ВВОД ДАННЫХ ЗАКОНЧЕН"

};

struct mes *p; // Указатель на элемент описания

p=&def[nom-1];

if (reg){

init_window(p->beg_x, p->beg_y, p->end_x, p->end_y, BLACK,

LIGHTGRAY, 1);

out_text(2, 2, 200, p->regim, p->text);

} else {

clear_window(p->beg_x, p->beg_y, p->end_x, p->end_y, EKRAN);

}

} // End message

Пример(продолжение)

Приведенные ниже функции включены в файл window.c.

/* Вывод строки в окно */

void out_text(int x, // Начальная позиция курсора по X

int y, // Начальная позиция курсора по Y

int kol, // Число выводимых символов

int reg, // Режим: r-разрядка, p-плотный

char *text){ // Текст сообщения

int i;

gotoxy (x, y);

for (i=0; i<kol && *(text+i)!= '\0'; i++){

if (reg=='r') putch (' ');

if (*(text+i)=='\n'){

y++;

gotoxy (x, y);

} else {

putch (*(text+i));

}

}

} // End out_text

 

Замечание. Символы второй кодовой страницы надо задавать в виде:

\<код символа в 8-й системе счисления>. См. ниже пример.

 

/* Рисование рамки */

void ramka( int type, // 0-одинарная, 1-двойная

int width, // ширина(в позициях)

int height){ // высота(в строках)

static unsigned char *cont[ ]={// коды символов псевдографики в 8-й системе

"\332\300\331\277\263\304", // одинарная рамка

"\311\310\274\273\272\315" // двойная рамка

};

int i;

gotoxy (1, 1);

putch (cont[type][0]);

for (i=2; i<width; i++) putch (cont[type][5]);

putch (cont[type][3]);

for (i=2; i<height; i++){

gotoxy (1, i);

putch (cont[type][4]);

gotoxy (width, i);

putch (cont[type][4]);

}

gotoxy (1, height);

putch (cont[type][1]);

for (i=2; i<width; i++) putch (cont[type][5]);

putch (cont[type][2]);

} /* End ramka */

Графический режим

Графический режим характеризуется установленным драйвером экрана и видеорежимом( mode ). Поскольку ОС MS DOS достаточно "древняя", то наиболее высокая по разрешению экрана и числу используемых цветов установка соответствует драйверу VGA с разрешением 640*480 пикселей и 16 цветами. Драйверы представляют собой файлы с расширением bgi (Borland Graphics Interface). Для описанного выше видеорежима подходит драйвер egavga.bgi. Возможно существуют для работы в MS DOS и драйверы SVGA с лучшим качеством, однако для решения наших задач указанного видеорежима достаточно. Чтобы работать в данном режиме, необходимо в пункте Options\Linker\Libraries среды разработки установить флажок Graphics Library. Перечень функций, входящих в эту библиотеку, и пояснения к ним можно найти в пункте Help\ContentsàFunctionsàGraphics routines.

Установка и закрытие

Поскольку по умолчанию при запуске приложения устанавливается текстовый режим, переход к графическому режиму выполняется следующей функцией:

void initgraph ( int * driver, int * mode, char * path);

Она инициализирует графический режим. Символические константы для параметров driver и mode заданы в файле graphics.h. Если в качестве первого параметра задана символическая константа DETECT, то функция находит установленный драйвер и задает режим с максимальным разрешением для него(настоятельно рекомендуется). Третий параметр функции указывает путь к директории, в которой располагаются драйверы.

Пример.

int gd= DETECT, mode;

initgraph (&gd, &mode, "c:\\bc\\bgi");

Если третий параметр – пустая строка, то драйвер экрана должен находиться в директории, из которой производится запуск приложения(текущей).

Пример. initgraph (&gd, &mode, "");

int graphresult ( void );

Функция возвращает информацию об исходе последней графической операции. Если инициализация режима прошла упешно, то возвращается 0. Перечень возможных ошибок при выполнении графических операций можно найти в описании функции graphresult в системе Help по ссылке graphics_errors. Для каждой ошибки определены символические константы. Так для успешного исхода используется константа grOk, равная 0. Эту функцию рекомендуется использовать сразу после вызова функции initgraph для проверки установки графического режима.

Пример.

int gd= DETECT, mode;

……………………………

initgraph (&gd, &mode, "");

gerror= graphresult ();

if (gerror!= grOk ){ // Ошибка инициализации

printf ("Ошибка! %s\n", grapherrormsg (gerror));

getch ();

exit (1);

}

char* grapherrormsg ( int errorcode);

Функция возвращает указатель на текст сообщения об ошибке, соответствующей коду ошибки, возвращаемому функцией graphresult.

Пример. Возможный текст сообщения из предыдущего примера.

Error! Device driver file not found (EGAVGA.BGI) àФайл драйвера EGAVGA.BGI не найден.

То есть данный файл в текущей директории не обнаружен.

void exit ( int status);

Функция завершает задачу. При этом:

- закрывает все файлы;

- выводит незаполненные буферы вывода.

Используется обычно при аварийном завершении задачи. Значение параметра status, равную 0, обычно сигнализирует о нормальном завершении, другое – нет. Прототип функции находится в файлах process.h и stdlib.h.

Она не имеет отношения к графическому режиму и описана здесь в связи с тем, что раньше не упоминалась.

void closegraph ( void );

Функция закрывает графический режим. Она освобождает всю память, используемую для обеспечения графического режима и восстанавливает тот режим, который был до вызова функции initgraph. Использовать обязательно!

Форматирование

Цвета

int getcolor ( void ); Возвращает текущий установленный цвет рисования.

void setcolor ( int color); Устанавливает текущий цвет рисования.

Замечание. Для стандартного видеорежима VGA набор(палитра) содержит 16 цветов. К сожалению, в отличие от текстового режима неясно соответствие номера(0 – 15) цвету. Надо проверить. Вероятно, можно использовать символические константы для текстового режима.

int getbkcolor ( void ); Возвращает текущий установленный цвет фона.

void setbkcolor ( int color); Устанавливает текущий цвет фона.

Битовые образы(pattern)

Для заполнения создаваемых фигур на экране используются образы размером 8*8 пикселей, заполненные некоторым образом. Стандартно доступны 12 различных стилей заполнения, на каждый из которых определена символическая константа.

0 EMPTY_FILL Цвет фона

1 SOLID_FILL Сплошное заполнение

2 LINE_FILL -- -- --

3 LTSLASH_FILL / / /

4 SLASH_FILL / / / (жирные)

5 BKSLASH_FILL \ \ \ (жирные)

6 LTBKSLASH_FILL \ \ \

7 HATCH_FILL Тонкая штриховка

8 XHATCH_FILL Толстая штриховка

9 INTERLEAVE_FILL Линии слоями

10 WIDE_DOT_FILL Широко расположенные точки

11 CLOSE_DOT_FILL Близко расположенные точки

12 USER_FILL Определенный пользователем образ заполнения

void setfillstyle ( int pattern, int color); Устанавливает текущий образ и цвет рисования. Этой функцией нельзя устанавливать образ, заданный пользователем (USER_FILL).

void getfillsettings ( struct fillsettingstype* fillinfo); Дает информацию о текущем битовом образе заполнения. Информация помещается в структуру типа, которая имеет вид:

struct fillsettingstype {

int pattern; // Текущий образ заполнения

int color; // Текущий цвет заполнения

}

void setfillpattern ( char * upattern, int color); Устанавливает определенный пользователем образ и цвет заполнения.

void getfillpattern ( char * pattern); Запоминает определенный пользователем образ в памяти. Для запоминания используется массив char pattern[8], каждый байт которого хранит информацию о 8 пикселях. Если какой-либо бит имеет значение 1, то соответствующий пиксель рисуется.

Пример. Образ типа "шахматная доска".

char CheckerBoard[8]={

0xAA, // 10101010

ox55, // 01010101

0xAA, // 10101010

0x55 // 01010101

0xAA, // 10101010

0x55, // 01010101

0xAA, // 10101010

0x55 // 01010101

};

Линии

void setlinestyle ( int linestyle, unsigned upattern, int thickness); Устанавливает стиль линии для рисования.

void getfillsettings ( struct linesettingstype* lineinfo); Дает информацию о текущих стиле, образе и толщине линии.


Структура linesettingstype имеет вид:

struct linesettingstype{

int linestyle;

unsigned upattern;

int thickness;

}

Стили линии задаются символическими константами:

0 SOLID_LINE Сплошная линия

1 DOTTED_LINE Пунктирная линия

2 CENTERED_LINE Линия по центру

3 DASHED_LINE Штриховая линия

4 USER_BIT_LINE Линия, заданная образом пользователя

upattern представляет собой 16-битовый образ, который применяется только при стиле USER_BIT_LINE. Так например, стиль SOLID_LINE эквивалентен значению 0xFFFF, а штриховая линия может задаваться значениями:

0x3333..xx..xx..xx..xx Короткие штрихи

0x0F0F ….xxxx….xxxx Длинные строки

0x3F3F..xxxxxx..xxxxxx Еще более длинные штрихи

Толщина линии задается символическими константами:

1 NORM_WIDTH Толщина 1 пиксель

3 THICK_WIDTH Толщина 3 пикселя

Текстовые фонты

Текстовым фонтом называют файл, с помощью которого на устройстве вывода(экран, принтер) отображаются символы. Различают точечные (bit-mapped, символы отображаются точечным образом – пикселями) и штриховые (stroked, символы строятся из отрезков прямых линий) фонты. В графическую систему встроен один точечный(8*8 пикселей) фонт, употребляемый по умолчанию (DEFAULT_FONT), и несколько штриховых, которые загружаются с диска из файлов с расширением .chr. Эти файлы располагаются в директории BGI транслятора. Для обозначения допустимых фонтов в файле graphics.h определены символические константы:

0 DEFAULT_FONT // 8*8 точечный фонт

1 TRIPLEX_FONT // Штриховые фонты

2 SMALL_FONT

3 SANS_SERIF_FONT

4 GOTHIC_FONT

5 SCRIPT_FONT

6 SIMPLEX_FONT

7 TRIPLEX_SCR_FONT

8 COMPLEX_FONT

9 EUROPEAN_FONT

10 BOLD_FONT

Большинство фонтов .chr, находящихся в директории BGI, не содержат русских символов, однако там есть директория Rus, внутри которой есть соответствующие русифицированные фонты. Для работы можно их просто переписать в директорию BGI, заменив соответствующие нерусифицированные. Кроме того, в директории Rus есть еще несколько русифицированных фонтов, которые можно использовать в программе с помощью функции installuserdriver. Там же находится программа Редактор фонтов Fe.exe, с помощью которой можно корректировать отдельные символы штриховых фонтов.

void settextstyle ( int font, int direction, int charsize); Устанавливает фонт, направление вывода текста(горизонтальное, символическая константа – HORIZ_DIR (0) и вертикальное (VERT_DIR (1), поворот на 900 против часовой стрелки), коэффициент увеличения символа(0 – 10). Если использовать точечный DEFAULT_FONT, то при charsize =5 размер символ составляет 40*40 пикселей. Значение charsize =0 используется только для штриховых фонтов и соответствует множителю по умолчанию 4 либо коэффициенту, заданному функцией setusercharsize.

Пример.

settextstyle ( EUROPEAN_FONT, VERT_DIR, 3);

void getsettingstype ( struct * texttypeinfo); Дает информацию о текущем текстовом фонте. Структура textsettingstype имеет вид:

struct textsettingstype{

int font;

int direction;

int charsize;

int horiz; // Параметры выравнивания по горизонтали

int vert; // и вертикали, см. функцию settextjustify

}

Пример. После действия функции settextstyle примера будем иметь:

gettextsettings (&cur_text);

cur_text.font à EUROPEAN_FONT

cur_text.direction à VERT_DIR

cur_text.charsize à 3

void settextjustify ( int horiz, int vert); Устанавливает выравнивание выводимого текста относительно текущего положения курсора. Задает 3 возможных положения текста в обоих направлениях. Эти положения определяются символическими константами:

по горизонтали:

0 LEFT_TEXT // Курсор слева от текста

1 CENTER_TEXT // Курсор по центру

2 RIGHT_TEXT // Курсор справа от текста

по вертикали:

0 BOTTOM_TEXT // Курсор под текстом

1 CENTER_TEXT // Курсор по центру

2 TOP_TEXT // Курсор над текстом

int textheight ( char * string); Возвращает высоту текстовой строки в пикселях.

int textwidth ( char * string); Возвращает длину текстовой строки в пикселях.

Эти функции полезны при расчете растояний между строками, размеров окон, в которые строки выводятся, и т.п.

void setusercharsize ( int multx, int divx, int multy, int divy); Позволяет задать нецелые коэффициенты увеличения символов по горизонтали и вертикали. Коэффициент по горизонтали равен multx / divx, по вертикали – multy / divy.

Пример. Увеличение по вертикали на 50%, по горизонтали – вдвое.

setusercharsize (2, 1, 3, 2);

Замечание. Функция работает только в том случае, если в предыдущем вызове функции settextstyle третий параметр charsize равен 0.

Если в программе требуется использование штрихового фонта, который не входит перечень символических констант BGI системы, то для его установки применяют функцию:

int installuserdriver ( char * full_path); Параметр full_path указывает полный путь к файлу .chr, возвращается идентификатор файла, который позже используется в функции settextstyle.

Пример.

fn03 = installuserdriver ("c:\bc\bgi\rus\fn03.chr");

……………………………………………………

settextstyle (fn03, HORIZ_DIR, 2);



Поделиться:


Последнее изменение этой страницы: 2017-02-08; просмотров: 357; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.116.49.143 (0.011 с.)