| WriteChar(X+(i*8-7), Y, Ord(S[i]), T, P^); { тень }

| WriteChar(X+(i*8-8), Y-1, Ord(S[i]), C, P^) { буква }

| end

| END;

| BEGIN { -— ОСНОВНАЯ ЧАСТЬ -— }

| TextBackGround(Red); ClrScr; { очистка экрана }

| TextColor(Yellow); { выбор цветов для букв }

| TextBackGround(Blue);

| WriteLargeString(1,20,#176,' ','Turbo-Сила'); { вызов }

| Readln { пауза до нажатия ввода }

| END.

Рис. 20.11 (окончание)

Завершая этот раздел, заметим, что подобным способом можно выводить крупные символы и более детальных матриц. Но тут появляются две проблемы: одна — определение места шрифта в памяти ПЭВМ (в общем случае это не просто) и вторая — размещение столь крупных символов (размером 8 строк на 14 столбцов) на экране.

<p>20.6. Управление формой курсора</p>

Мигающий курсор постоянно присутствует на экране дисплея, если он отображает текстовую информацию (во время счета или

- 490 -

ввода-вывода данных на экран). Иногда он совершенно не нужен, например при работе систем меню на экране или при выводе заставки программы и т.п.

Можно управлять формой курсора до полного его отключения с помощью функции номер 1 аппаратного прерывания 10H. Нужно лишь загрузить в определенные регистры начальную и конечную линии курсора и вызвать прерывание.

Размер курсора по вертикали не может превышать размер символа: какова высота матрицы текущего шрифта, таково и число линий (строк) в курсоре. Ширина курсора неизменна и равна ширине матрицы шрифта. Начальная и конечная линии отсчитываются сверху вниз, причем самая верхняя линия нумеруется как нулевая. Подразумевается, что конечная линия находится ниже начальной, но может быть и наоборот. Варианты вида курсора в зависимости от расположения этих линий показаны на рис. 20.12. Темные области соответствуют видимой мигающей части курсора.

Рис. 20.12

Если верх матрицы имеет четкий номер 0, то ее низ «плавает» в зависимости от текущего шрифта. Так, для адаптера CGA рабочий диапазон будет 0..7, для MDA/Hercules — 0..13. Адаптер EGA использует оба этих интервала в зависимости от режима работы (шрифт 8x8 или 8x14). Для адаптеров класса VGA этот диапазон может вырасти до размеров соответствующих шрифтов (но в режимах эмуляции CGA и MDA на этих адаптерах диапазоны будут по-прежнему 0..7 и 0..13).

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

- 491 -

Значение стартовой линии, равное 32, отключает курсор (делает его невидимым). Отключить мигание курсора нельзя, так как оно реализовано аппаратно. Пример процедур, меняющих форму курсора, приведен на рис. 20.13.

| { ПРИМЕР ПРОЦЕДУР ИЗМЕНЕНИЯ ФОРМЫ КУРСОРА }

| CRT, DOS; { используются модули CRT и DOS }

| { Процедура устанавливает форму курсора, }

| PROCEDURE SetCursorSize(c_Start, c_End : Byte );

| VAR

| Regs : Registers; { доступ к регистрам }

| BEGIN

| with Regs do begin

| AH = $01; { функция формы курсора }

| CH = c_Start; { стартовая линия курсора }

| CL = c_End; { конечная линия курсора }

| end; {with}

| Intr($10, Regs) { вызов прерывания 10H БСВВ }

| END;

| { Процедура устанавливает нормальную форму курсора. }

| PROCEDURE SetNormalCursor;

| VAR SE : Word; { компактная запись линий }

| BEGIN

| if ( LastMode >= Font8x8 )

| then

| SE:=$0507

| else

| if (LastMode = Mono ) then SE:=$0B0C

| else SE:=$0607;

| SetCursorSize( Hi(SE ), Lo(SE))

| END;

| { Процедура устанавливает крупный блок-курсор. }

| PROCEDURE SetBlockCursor;

| VAR с_End : Byte;

| BEGIN

| if ( LastMode >= Font8x8 ) or ( LastMode <> Mono )

| then c_End := 7

| else c_End := 13;

| SetCursorSize( 0, с_End )

| END;

Рис. 20.13

- 492 -

| { Процедура отменяет курсор (делает его невидимым). }

| PROCEDURE SetNoCursor;

| BEGIN

| SetCursorSize( 32, 0 )

| END;

| { -— ПРИМЕР ВЫЗОВОВ -— }

| BEGIN

Перейти на страницу:

Поиск

Похожие книги