Функції AH=06 і 07
переривання 10h BIOS здійснюють так називаний скролінг (прокручування) вікна екрана. При виконанні скорллинга
на один рядок нагору вся інформація у вікні переміщається на рядок нагору.
Унизу вікна з'являється чистий рядок. При виконанні скролінга на один рядок
униз уміст вікна зрушується на рядок вниз і угорі вікна додається чистий рядок.
Значення регістра AL задає число рядків, на яке виконується скролінг. Якщо
AL=0, виконується очищення вікна.
Значення в CH і CL визначають рядок і
стовпець лівого верхнього кута вікна, у
DH і DL – рядок і стовпець правого нижнього кута. Рядки і стовпці
нумеруються від 0. Значення в регістрі ВH задає атрибут чистого рядка, що
додається.
Приведемо приклад
Сі-функції, що виконує вертикальний скролінг вікна екрана, заданого рядком і
стовпцем лівого верхніх (1_row, l_col) і рядком і стовпцем правого нижніх
(r_row, r_col) кутів вікна. Якщо перемінна direction дорівнює UP, відбувається
скролінг на один рядок нагору, якщо вона дорівнює DOWN – скролінг на один рядок
униз, якщо ENTIRE – виконується очищення вікна. Додається рядок з атрибутом
attr.
/*L9_5.C*/
#include<dos.h>
#include“screen.h”
void scroll( int direction, char l_row, char
l_col,
char r_row, char r_col, char
attr )
{ union REGS r;
if
(direction)
{
r.h.al=1; r.h ah=direction; }
else
{
r.h.al=0; r.h.=6 }
r.h.ch=l_row; r.h.cl=l_col; r.h.dh=r_row;
r.h.dl=r_col; r.h.bh=attr; int86(0x10, &r,
&r);
}
Якщо вікно займає
весь екран і задається direction=ENTIRE, відбувається фактичне очищення всього
екрана і його “заливання” кольором, що задається атрибутом чистого рядка
(attr). Наприклад, для очищення екрана в режим з 25 рядками і 80 стовпцями
scroll (ENTIRE, 0, 0, 24, 79, 0x07);
Для одержання
кольорової рамки по периметрі всього екрана можна виконати два звертання:
scroll(ENTIRE, 0, 0, 24, 79, color);
scroll(ENTIRE, 1, 1, 23, 78, 0x07);
Тут значення color –
атрибут. Колір рамки буде збігатися з кольором тла символу, тому що символ є пробіл.
Скролінг вікна засобами
BIOS можливий як у текстових, так і в графічних режимах роботи видеоадаптора.
Скролінг у графічних CGA – режимах має деякі особливості, що докладно
розглянуті в 9.7.
Одним з цікавих
застосувань скролінга є побудова “”
вікон, щовибухають, (exploding windows). Такі вікна “виростають” на екрані
з визначеного місця (середини, одного з кутів, спочатку заповнюється середня
горизонталь, а потім вікно розсовується нагору і т.п.). Секрет побудови “”
вікон, щовибухають, простий. Починаючи з визначеного місця вікна (наприклад,
його центра), виконується очищення першого, самого маленького вікна. Після
цього по периметрі цього вікна малюється рамка. Потім координати лівого
верхнього і правого нижнього кутів модифікуються, і усе повторюється: очиска
старої рамки скролінгом, висновок нової, більшого розміру,модифікація координат
кутів і так далі доти, пір, поки вікно не “виросте” до нормальних розмірів.
Вибір початкової крапки
і закону розсовування кутів проміжних вікон визначають напрямок “вибуху”. Нижче
приведений приклад функції expl_win (), що виводить “” вікно, щовибухає,
заданими координатами лівого верхнього і правого нижнього кутів. У результаті
її роботи вікно “росте” з центральної ечейки вікна, проходячи 10 фаз і
розширюючи одночасно як по горизонталі, так і по вертикалі. Зміст параметрів
style, s0, c0, s1,c1, atr збігається з параметрами функції border (). Якщо
style = NULL, рамка під час “вибуху” не виводиться. Параметр color задає колір
“заливання” вікна при виконанні скролінга. Використовується активна відеосторінка
адаптера. У випадку успіху функція повертає константу ОК; якщо вікно не може
бути побудовано, “вибух” не відбувається і повертається константа BAD_PARAM.
/*L9_6.C*/
#define HOR_STEP 2/*крок по вертикалі*/
#define VERT_STEP 1/*крок по горизонталі*/
#define TIME 5/*затримка між фазами*/
#include <dos.h>
#include “screen.h”
int expl_win (char s0, char c0, char s1, char
c1,
char color, cha style[],
char atr)
{ register char max_stolb, max_string;
register int cur_s0, cur_c0,cur_s1, cur_c1;
max_stolb=*(char far*) MK_FP(0x40, 0x4a);
max_string=*(char far*) MK_FP(0x40, 0x84);
/*Контроль того, чи можна побудувати вікно.*/
if
(s0>=0&&s0<s1&&c0>=0&&c0<c1&&
s1<=max_string&&c1<max_stolb)
{/*Установка
початкових координат вікна*/
cur_s0=(s1+s0)>>1;
cur_c0=(c0+c1)>>1;
cur_s1=cur_s0; cur_c1=cur_c0;
/*Цикл
стирання і висновку рамки вікна.*/
while
(cur_c0||cur_s0>s0||cur_c1<c1||cur_s1<s1)
{
scroll(ENTIRE, cur_s0, cur_c0, cur_s1, cur_c1, color);
if
(style!-NULL)
border (cur_s0, cur_c0, cur_s1, cur_c1,
NULL, atr, stule, atr);
/*модифікація координат вікна.*/
cur_c0-=HOR_STEP; cur_c1+=HOR_STEP;
cur_s0-=VERT_STEP; cur_s1+=VERT_STEP;
cur_c0=(cur_c0<c0)? c0: cur_c0;
cur_c1=(cur_c1>c1)? c1: cur_c1;
cur_s0=(cur_s0<s0)? s0: cur_s0;
cur_s1=(cur_s1>s1)? S1: cur_s1;
delay(TIME); }
/*Остання остаточна фаза вікна.*/
scroll(ENTIRE, cur_s0, cur_c0, cur_s1, cur_c1,
color);
if
(style!=NULL)
border(cur_s0, cur_c0, cur_s1, cur_c1,
NULL, atr, style, atr);
return
OK;
}
else return BAD_PARAM;
}
Відзначимо, що для комп'ютерів з високою тактовою
частотою для одержання видимого ефекту приходиться спеціально встановлювати
затримку між фазами вікна.
![]() |
![]() |
![]() |