Вывод на экран монитора производится либо в текстовом режиме, либо в графическом. При переходе к текстовому режиму содержимое видеопамяти не изменяется. При переходе от текстового режима к графическому содержимое видеопамяти очищается, поэтому необходимо иметь функции вывода текстовой информации в графическом режиме. Для этой цели предназначены функции
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;
}