1.6. Вывод текста в графическом режиме

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

voidouttextxy(intx,inty,charfar*textstring);

voidouttext(charfar*textstring),где (x,y) — координаты точки, относительно которой производится вывод текстовой строки, находящейся по адресу textstring .

Для изменения размера букв применяется функция

voidsettextstyle(intfont,intdirection,intcharsize),

где font — номер шрифта для вывода букв; direction — направление (горизонтальное либо вертикальное); charsize — коэффициент увеличения размера шрифта. Например, чтобы увеличить в два раза размер шрифта, установленного по умолчанию, следует вызвать функцию settextstyle следующим образом:

settextstyle(DEFAULT_FONT,HORIZ_DIR,2).

Вывод текста производится относительно опорной точки. Опорная точка в выводимой строке может занимать одно из 9 различных положений — в верхней левой точке, в верхней средней, в верхней правой и т.д. (Перебираются все пары слов, полученные комбинированием одного из слов "верхняя", "средняя", "нижняя" с одним из слов "левая", "средняя", "правая"). Положение опорной точки изменяется функцией voidsettextjustify(inthoriz,intvert), где целые числа horiz и vert принимают значения  0, 1, 2 .  По умолчанию текст выводится так, что опорная точка CP находится в левом верхнем углу пространства, занимаемого текстом. Например, после вызова outtext("ababababa") положение выведенного текста и CP будет следующим:

Если же изменить положение опорной точки с помощью settextjustify(1,1), то после вызова outtext("abababa") точка CP будет в центре текста.

Для работы с текстом в графическом режиме полезно иметь функции, аналогичные функциям printf и scanf. Приведем пример, как можно написать эти функции, используя возможность создания  функций с переменным числом параметров.

int gscanf(int xsym, int ysym, char *text, …)

{

va_list aptr; char str[140]; int count=0;

va_start(aptr, str );

while ((str[count]=getch())!=ENTER)

{

str[count+1]=’';

gprintf(xsym+count,ysym,str+count);

count++ ;

}

vsscanf(str, text, aptr);

va_end(aptr);

returncount;

}

int gprintf (int xsym, int ysym, char *text, … )

{

va_list aptr; char str[140]; int count;

va_start (aptr, text);

count = vsprintf (str, text, aptr);

outtextxy ((xsym-1)*textwidth ("M"),

(ysym-1)*(2+textheight ("M")),str);

va_end (aptr);

return count;

}