Введение.
~~~~~~~~~
    Вашему вниманию предлагается пробная (демонстрационная) версия библиотеки
оконного интерфейса SHELL, которая должна облегчить Вам написание красивых
программ на C--.
    При написании библиотеки за образец была взята библиотека на C++ оконного
интерфейса BOOST (tm) версии 1.01 гамма. Автор Vadim Petrenko 2:5010/58.4.
    Библиотека компилируется компилятором версии не ниже 0.212 и работает на
компьютерах не хуже 386 с видеокартой не хуже VGA.

Файлы входящие в библиотеку.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
BOX.H--     рисует прямоугольник в текущем окне.
DEMO        директория с демонстрационной программой.
EVENT.H--   обработка событий от мыши и клавиатуры.
G_MOUSE.H-- псевдографический курсор мыши.
HOK.H--     кнопка OK и события связанные с ней.
LINE.H--    рисование линий в окне.
LOW.H--     различные переменные, структуры и процедуры.
MOUSE2.H--  процедуры работы с мышью.
README.TXT  этот текст.
SHABLON.C-- файл-шаблон для написания программ с помощью этой библиотеки.
SHELL.H--   инициализация и закрытие оболочки.
STRINGS.H-- некоторые строковые процедуры.
TEXT.H--    процедуры являющиеся основой для создания элементов библиотеки.
THERM.H--   создание линейки процесса.
VIDEOS.H--  определение параметров видеосистемы.
WINDOW.H--  процедуры создания окна и вывода в текущее окно.
_STRING.H-- ввод текста пользователем.

Идеология работы оболочки.
~~~~~~~~~~~~~~~~~~~~~~~~~~
    Данная библиотека позволяет выводить на экран до 32 окон. Активным
является последнее открытое окно. Чтобы активизировать предыдущее окно надо
или закрыть текущее или его спрятать (спрятать можно также до 32 окон). Т.е.
доступ к окнам организован по принципу стека.

Основные процедуры библиотеки.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void InitShell() - Все программы должны начинаться с вызова этой процедуры
byte hRead(word proc) - Ждет события от клавиатуры и мыши.
  proc - адрес процедуры, на которую будет передаваться управление в цикле
         ожидания события. Если такой процедуры не требуется, то этот
         параметр равен 0.
    При нажатии на клавишу или кнопку мыши процедура заполняет следующую
структуру:
struct _EVENT{
	byte what;       // к чему относится событие (мышь, клавиатура...
	word keyCode;    // код нажатой клавиши
	int buttons;     // состояние кнопок мыши
	int doubleClick; // doubleClick произошел
	int mrow,mcol;   // абсолютная позиция указателя мыши
	int mwrow,mwcol; // относительно окна
	int mouseWhat;   // че с мышью произошло
}Event;
Процедура возвращает байт Event.what который может принимать следующие
значения:
         evKeyboard=1  // нажатие клавиши
         evMouse=2     // что-то с мышью
         evMessage=3   // пользовательское сообщение
         evCloseWin=4  // нажата кнопка закрыть окно
Переменная mouseWhat структуры Event может принимать следующие значения:
 evMousePress    1 // нажатие кнопки
 evMouseRelease  2 // отпускание кнопки
 evMouseAuto     3 // автогенерируется при нажатой кнопке
 evMouseNothing  4 // ничего
    По идее эта процедура должна стать сердцем библиотеки - принимать и
обрабатывать все сообщения и возвращать управление лишь при закрытии окна.
Но пока она только принимает сообщения, предоставляя Вам возможность самим
делать обработку. Сейчас процедура обрабатывает лишь события выхода из
программы (нажатие клавиш Alt+X и двойной клик на символах закрытия). Также
обрабатывается перетаскивание окон мышью.

	       Манипуляции с окном.
	       ~~~~~~~~~~~~~~~~~~~~
void hWindow(int wrow,wcol,height,width,title,scheme,shadow) - создать окно
  wrow, wcol - координаты левого верхнего угла окна на экране.
  height,width - размеры окна
  title - адрес строки с заголовком окна. Если строка будет нулевой длины, то
        окно будет без рамки.
  scheme - цветовая схема окна. Окно может иметь одну из следующих схем:
           idNormal=0 - голубой фон
           idAccent=1 - красный фон
           idDialog=2 - коричневый фон
           idHelp  =3 - зеленый фон
           idBlack =4 - серый фон
  shadow - нужна ли тень к окну.
    Эта процедура заполняет структуру:
struct _Window_
{
	int wbuf;   //адрес буфера с образом экрана под окном.
	int wsbuf;  //адрес буфера с образом экрана под тенью.
	byte srow;  //номер строки экрана начала окна
	byte scol;  //номер колонки экрана начала строки
	byte erow;  //вертикальный размер окна в строках.
	byte ecol;  //горизонтальный размер экрана в знакоместах.
	byte btype; //тип окна
	byte border; //флаг наличия у окна рамки
	byte row;   //вертикальное положение курсора в окне
	byte column;//горизонтальное положение курсора в окне.
	byte attr;  //текущий атрибут
	byte scheme; //цветовая схема окна (номер)
	byte lmargin;//отступ слева
	byte shadow; //есть тень или нет ее
}Window;
void rWindow() - закрыть текущее окно.
void hInfoWindow(int str,scheme) - создать информационное окно
  str - адрес строки с информацией.
  scheme - цветовая схема окна.
void rInfoWindow() - закрыть информационное окно
void whide() - спрятать текущее окно.
void wunhide() - восстановить спрятанное окно.
	       Вывод в окно.
	       ~~~~~~~~~~~~~
void Say(int wrow,wcol,attr,str) - Вывести строку на указанную позицию
  wrow,wcol - координаты строки относительно левого верхнего угла окна.
  attr      - цвет строки.
  str       - адрес строки.
void hprints(int wrow,wcol,attr,button,hilight) - Вывод строки с подсветкой
						  отдельных букв.
  wrow,wcol - координаты строки относительно левого верхнего угла окна.
  attr      - цвет строки.
  button    - адрес строки.
  hilight   - цвет выделяемых букв.
	      Буквы которые будут выделены отдельным цветом определяются
	      наличием перед ними символа ` (апостроф ascii 60h).
void hprints2(int wrow,wcol,attr,str,hilight) - Вывод строки с подсветкой
						отдельных фраз.
  wrow,wcol - координаты строки относительно левого верхнего угла окна.
  attr      - цвет строки.
  str       - адрес строки.
  hilight   - цвет выделяемых фраз.
	      Фразы которые будут выделены отдельным цветом выделяются
	      символами ^U в начале и конце фразы.
void Button(int wrow,wcol,button,activ,pressed) - изображает кнопку.
  wrow,wcol - координаты строки относительно левого верхнего угла окна.
  button    - адрес строки с названием кнопки.
	      Горячие буквы определяются наличием перед ними символа `
              (апостроф ascii 60h).
  activ     - флаг активности. Если он установлен, то кнопка изображается
	      активной.
  pressed   - флаг нажатия. Если он установлен, то кнопка изображается
              нажатой.
void wputs(int str) - Вывод строки в текущее окно и текущие координаты.
  str - адрес строки.
  Эта процедура поддерживает управляющие esc-последовательности:
    + - Увеличить на единицу цвет символов.
    - - Уменьшить на единицу цвет символов.
    Ann - Установить новый атрибут цвета. Где nn код цвета.
    Fnn - Установить новый цвет символа. Где nn код цвета.
    Bnn - Установить новый цвет фона. Где nn код цвета.
    I - Инвертировать бит интенсивности.
    L - Инвертировать бит мигания.
    Rnn - Перейти на указанную строку. Где nn - номер строки в окне.
    Сnn - Перейти на указанную колонку. Где nn - номер колонки в окне.
void FillBox(int wrow,wcol,height,width,ch,attr) - закрасить прямоугольник.
  wrow,wcol - координаты начала прямоугольника относительно левого верхнего
              угла окна.
  height,width - размеры прямоугольника.
  ch        - код символа заполнения. Если он равен нулю, то меняется только
              цвет фона. Если код символа равен 256, то будет заменен атрибут
	      а символы останутся теми же.
  attr      - атрибут заполнения.
void vprints(int wrow,wcol,width,margin,attr,str) - еще одна процедура вывода
                                                  строки.
  wrow,wcol - координаты строки относительно левого верхнего угла окна.
  width     - ширина в пределах которой выводится строка.
  margin    - отступ слева.
  attr      - цвет строки.
  str       - адрес строки.
              Эта процедура очищает остаток строки на экране.
void cprints(int wrow,wcol,width,attr,str) - вывод отцентрированной строки.
  wrow,wcol - координаты строки относительно левого верхнего угла окна.
  width     - ширина в пределах которой будет центрироваться строка.
  attr      - цвет строки.
  str       - адрес строки.
void Box(int wrow,wcol,height,width,title) - рисует рамку с сообщением.
  wrow,wcol - координаты начала рамки относительно левого верхнего
              угла окна.
  height,width - размеры рамки.
  title     - адрес строки с сообщением. Если адрес равен 0, то сообщение не
              выводится.
void VertLine(int wrow,wcol,height,attr) - нарисовать вертикальную линию.
  wrow,wcol - координаты начала верхнего конца линии.
  height    - длина линии.
  attr      - цвет линии
void HorLine(int wrow,wcol,width,attr) - нарисовать горизонтальную линию.
  wrow,wcol - координаты начала левого конца линии.
  height    - длина линии.
  attr      - цвет линии
void ShowTherm2(int wrow,wcol,width,percent) - столбик процесса с процентами.
  wrow,wcol - координаты начала левого конца столбика.
  width     - ширина столбика.
  percent   - число процентов от 0 до 100.
void ShowTherm(int wrow,wcol,width,percent) - столбик процесса без процентов.
  wrow,wcol - координаты начала левого конца столбика.
  width     - ширина столбика.
  percent   - число процентов от 0 до 100.
void StringShow(int this) - показывает редактируемую строку.
  this - флаг активности ввода строки. Перед использованием этой процедуры
         надо заполнить структуру cstr.
     struct _STR_{
	int str;	//адрес строки
	int width;	//длина строки
	int cpos;	//положение курсора, обычно 0
	int wrow,wcol;	//координаты начала строки в окне
     }cstr;
void Edit_String(int xch) - редактирование строки.
  xch - код нажатой клавиши.
      Пример использования StringShow и Edit_String можно посмотреть в файле
      ptest.c--
void hOK2(int act,pres) - рисует кнопку OK в середине нижней строки экрана.
  act - флаг активности кнопки.
  pres - флаг нажатия кнопки.
int hOKPress() - Отслеживает нажатие на кнопку OK мышью или клавишей O.
  Возвращает TRUE если произошло нажатие.
int Ask(word askmes,namewin,sxeme) - Выводит окно с двумя кнопками 'ДА' и
                                     'НЕТ'.
  askmes  - строка содержащая вопросительное предложение.
  namewin - название окна (если передать пустую строку, то выводится окно без
            верхней полоски).
  sxeme   - цветовая схема окна.
  Возвращает FALSE если нажата кнопка 'НЕТ' и TRUE если 'ДА'.
void Radio(int y,x;byte activ,select;word str) - Вывод радио-кнопки.
  x,y    - координаты кнопки в окне.
  activ  - отображать кнопку активной.
  select - отображать кнопку выбранной.
  str    - сообщение выводящееся справа от кнопки.



Другие полезные процедуры.
~~~~~~~~~~~~~~~~~~~~~~~~~~
void KbSetKey(word xch,fn) - Привязывает к клавише функцию.
  xch - код клавиши
  fn  - адрес процедуры. Если ввести 0 то клавиша будет удалена из списка.
	Можно назначить до 10 горячих клавиш.
void MoClear() - Ждать отпускания кнопки мыши.
void KBCLEAR() - Очистка буфера клавиатуры.
int TABSTOP() - Число знакосимволов до позиции следующей табуляции.
        AX - номер колонки
        BX - шаг табуляции
int Malloc(word size) - Получить блок памяти.
  size - размер требуемого блока в байтах.
  Возвращает адрес выделенного сегмента. При выделении блока процедура
  очищает его нулями.
void FREE() - Освободить выделенный блок памяти.
  AX - адрес сегмента освобождаемого блока памяти.
int FARCORELEFT() - Возвращает размер максимального доступного блока памяти в
                    параграфах.
void ATEXIT() - Фиксирует адрес процедуры, которая выполнится при завершении
                программы.
  AX - адрес функции. Можно задавать до 8 функций.

И другие менее полезные, но не менее важные процедуры.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void ScanMouse() - Если нажата кнопка на мыши - генерирует событие.
void ScanKeyboard()- При нажатии на клавишу генерирует событие.
int wcols() - Возвращает ширину текущего окна.
int wlrow() - Возвращает абсолютную вертикальную координату начала окна.
int wlcol() - Возвращает абсолютную горизонтальную координату начала окна.
int wrows() - Возвращает длину окна.
int MAX() - Определяет большее из 2 чисел.
SEGDS() - Находясь в сегменте кода содержит адрес сегмента данных. Это
          необходимо для обработчика прерываний при компиляции файла типа EXE.
long timer() - Возвращает число тиков прошедших с начала суток.
void DefineFont() - заменяет текущие фонты знакогенератора.
void GoodFont() - Переназначает коды символов псевдографики.
void DefineChar(char size;int ch,font) - заменяет один фонт знакогенератора.
void ShowProgNote() - Выводит в верхнюю строку экрана дополнительную информацию
void ShowProgFootnote() - Выводит в правый нижний угол дополнительную информацию
void ShowMessage() - Вывод сообщения в нижней строки экрана.
void msinit() - инициализация курсора мыши
void msuninit() - деинициализация курсора мыши
:void msbclear()
:void msbpress(int button,bstat,bcount,row,col)
:void msbreles(int button,bstat,bcount,row,col)
:void mscondoff(int srow,scol,erow,ecol) - диапазон где курсор будет виден
:void MSCURSOR() - цвет текстового курсора
void MSGOTOXY()
:void mshbounds(int leftcol,rightcol) - установить диапазон перемещения по горизонтали
void mshidecur()
:void msmotion(int rowcount,colcount) - получить скорость перемещения мыши
void msshowcur()
:void MSSPEED() - установить скорость перемещения мыши
void msstatus(int bstat,row,col) - получить положение курсора и состояние кнопок
:void msvbounds(int toprow,botrow) - установить диапазон перемещения по горизонтали
void printc_(int row,col,attr,ch) - выводит символ на экран.
  row,col - абсолютные координаты места куда будет выведен символ.
  ch      - код символа. Если он равен нулю, то меняется только цвет фона.
            Если код символа равен 256, то будет заменен атрибут а символ
            останется тем же.
  attr    - Цвет символа.
void box_(int srow,scol,erow,ecol,boxtype,attr)
void fill_(int srow,scol,erow,ecol,ch,attr)
void BackWin()
void RestWin()
void wopen(int srow,scol,erow,ecol,btype,scheme;word openSpeed;int shadow)
int wsave(int srow,scol,erow,ecol)
void wshadow()
void wgotoxy(int wrow,wcol)
int wchkcol(int wcol)
int wchkcoord(int wrow,wcol)
int wchkrow(int wrow)
void wclose()
void wshadoff()
void wrestore(int wbuf)
void printc(int row,col,attr,ch)
:int ISSPASER() - Проверка на непечатный символ
  AL - код символа.
    Возвращает TRUE если это непечатный символ.
:int STROCC() - Число указанных символов в строке.
  AX - адрес строки
  BL - символ
void STRSETSZ() - Изменить размер строки
  AX - адрес строки
  CX - новый размер строки.
void STRNCAT() - дописать к строка указанное число символов из другой строки
  AX - адрес строки к которой будет добавлена часть другой строки.
  BX - адрес строки из которой будут добавлены символы.
  CX - сколько добавлять символов.
:int INTTOSTR() - Преобразовать INT в строку
  AX - число
  BX - адрес строки
:int LONGTOSTR() - Преобразовать LONG в строку
  EAX - число
  BX  - адрес строки
:void STRSHL() - Сдвиг строки влево с заполнением пробелами освободившегося места
  AX - адрес строки
  CX - на сколько символов сдвинуть строку.
void STRTRIM() - Удаляет последние незначащие символы
  AX - адрес строки
void strshr(int str,count) - Сдвиг строки вправо с заполнением пробелами
                             освободившегося места.
byte vidtype() - Возвращает тип видеоадаптера.
// типы дисплейных адаптеров
enum {V_NONE,V_MDA,V_CGA,V_EGA,V_EGA2,V_EGAMONO,V_VGAMONO=7,V_VGA,V_MCGA,V_MCGAMONO};
void videoinit() - инициализация видеосистемы.
  Эта процедура заполняет следующую структуру:
struct _VINFO_ {
	int videoseg;   //сегмент видеопамяти
	byte adapter;	//тип видеоадаптера
	byte numrows;   //число строк на экране
	byte numcols;   //число колонок на экране
	byte mheight;   // делитель для мыши по Y
	byte mwidth;    // по X
}_vinfo;
void setlines(int numlines) - Установить число строк экрана. Поддерживает
                              только 25 или 50 строк.
void SetBlink(int mode) - Устанавливает или снимет бит мигания.
void cclrscrn(int attr) - Очищает экран.
void ShowTitle(int str) - Выводит заголовок у текущего окна.
void CloseChar() - нарисовать символ закрытия окна.
void wbprintc(int offs,attr,ch) - Вывод символа на рамку.
void wprintc(int wrow,wcol,attr,ch) - Вывод символа в окно.
void prints(int row,col,attr,str) - Вывод строки в окно.
void MoveBox(int row,col) - Перемещение рамки в новые координаты.
void MoveWindowStart() - Начало перемещения окна.
void MoveWindowFinish() - Окончание перемещения окна.
void MoveWindowDo() - Само перемещение окна.
void wmove(int nsrow,nscol) - Перерисовка окна на новое место.
int process_esc(int stri) - Обработка ESC последовательности строки.
void wreadcur(int wrow,wcol) - получить координаты курсора в окне
void wscroll(byte count,direction) - Скроллинг всего окна.


    Библиотека свободна к распространению и использованию, только не берите
за нее денег :) и не удаляйте копирайты.

  Если возникнут вопросы, пожелания или Вы захочете принять участие в развитии
  этой идеи - вот мой адрес:

					   Fido 2:5021/3.111
                                            или 2:5021/3.40
					   E-Mail sheker@char.ru
					   Mishel Sheker.




