{
rg.x.ax = 0x0100;
rg.x.bx = 0;
rg.x.cx = t;
int86( 16, &rg, &rg );
}
char attrib = 7;
/* очистить экран */
void clear_screen()
{
cursor(0, 0);
rg.h.al = ' ';
rg.h.ah = 9;
rg.x.bx = attrib;
rg.x.cx = 2000;
int86( 16, &rg, &rg );
}
/* возвратить режим работы видеоконтроллера*/
int vmode()
{
rg.h.ah = 15;
int86( 16, &rg, &rg);
return rg.h.al;
}
/* проверить клавишу Scroll Lock */
int scroll_lock()
{
rg.x.ax = 0x0200;
int86( 0x16, &rg, &rg);
return rg.h.al & 0x10;
}
void (* helpfunc)();
int helpkey = 0;
int helping = 0;
/* принять символ от клавиатуры */
int get_char()
{
int c;
while (1) {
rg.h.ah = 1;
int86(0x16, &rg, &rg);
if (rg.x.flags & 0x40) {
int86(0x28, &rg, &rg);
continue;
}
rg.h.ah = 0;
int86(0x16, &rg, &rg);
if (rg.h.al == 0)
c = rg.h.ah | 128;
else
c = rg.h.al;
if (c == helpkey && helpfunc) {
if (!helping) {
helping = 1;
(*helpfunc)();
helping = 0;
continue;
}
}
break;
}
return c;
}
/* занести код символа и его атрибуты в видеопамять */
void vroke(unsigned vseg, unsigned adr, unsigned chr)
{
if (vseg == 45056) /* монохромный режим */
poke(vseg, adr, chr);
else {
_DI = adr; /* смещение до адреса символа в видеопамяти */
_ES = vseg; /* адрес сегмента видеопамяти */
asm cld;
_BX = chr; /* атрибуты и код символа */
_DX = 986; /* состояние видеопорта */
/* ждать начала обратного хода луча*/
do
asm in al,dx;
while (_AL & 1);
/* ждать завершения обратного хода луча */
do
asm in al,dx;
while (!(_AL & 1));
_AL = _BL;
asm stosb; /* запомнить символ */
/* ждать начала обратного хода луча */
do
asm in al,dx;
while (_AL & 1);
/* ждать завершения обратнога хода луча */
do
asm in al,dx;
while (!(_AL & 1));
_AL = _BL;
asm stosb; /* запомнить атрибуты */
}
}
/* считать код символа и его атрибуты из видеопамяти */
int vpeek(unsigned vseg, unsigned adr)
{
int ch, at;
if (vseg == 45056) /* монохромный режим */
return peek(vseg, adr);
asm push ds;
_DX = 986; /* состояние видеопорта */
_DS = vseg; /* адрес сегмента видеопамяти */
_SI = adr;/* смещение до адреса символа в видеопамяти */
asm cld;
/* ждать начала обратного хода луча */
do
asm in al,dx;
while (_AL & 1);
/* ждать завершения обратного хода луча */
do
asm in al,dx;
while (!(_AL & 1));
asm lodsb; /* считать символ */
_BL = _AL;
/* ждать начала обратного хода луча */
do
asm in al,dx;
while (_AL & 1);
/* ждать завершения обратного хода луча */
do
asm in al,dx;
while (!(_AL & 1));
asm lodsb; /* считать атрибут */
_BH = _AL;
_AX = _BX;
asm pop ds;
return _AX;
}
/* keys.h */
#define HT 9
#define RUBOUT 8
#define BELL 7
#define ESC 27
#define SHIFT_HT 143
#define CTRL_T 20
#define CTRL_B 2
#define CTRL_D 4
#define ALT_D 160
#define F1 187
#define F2 188
#define F3 189
#define F4 190
#define F5 191
#define F6 192
#define F7 193
#define F8 194
#define F9 195
#define F10 196
#define HOME 199
#define UP 200
#define PGUP 201
#define BS 203
#define FWD 205
#define END 207
#define DN 208
#define PGDN 209
#define INS 210
#define DEL 211
#define CTRL_HOME 247
#define CTRL_BS 243
#define CTRL_FWD 244
#define CTRL_END 245
Заключение
-----------------------------------------------------------------
На основе представленных выше функций нижнего уровня в
разделе 5 будет развиваться и объясняться концепция экранных
окон, которая составляет следующий, более высокий, уровень в
многоуровневом наборе функций, описываемых в данной книге.
ГЛАВА 5
-------
Экранные окна
-----------------------------------------------------------------
Этот раздел посвящен вопросу о том, что собой представляют
экранные окна и как с ними работать. Раздел 6 разъясняет, как
можно использовать окна в ваших программах, создаваемых в среде
Турбо Си, а также содержит полную библиотеку функций управления
окнами. Следующие разделы содержат расширенную библиотеку
функций, поддерживающих работу с окнами для специфических целей,
как, например, для контекстно-чувствительного вывода справочной
информации, редактирования текста, ввода данных и создания меню.
После того, как вы прочитали об экранных окнах, способах их
создания и применения, постарайтесь вспомнить программные
системы, которые используют подобные средства. Подумайте
также и о том, какую пользу могли бы принести эти средства для
тех программных проектов, в которых вы принимали участие. Затем
попытайтесь найти в этих функциях недостатки, устранение которых
позволит сделать функции более подходящими для вашей работы. В
любой программе вы почти всегда можете отыскать эти недостатки.
В данном случае вы имеете большое преимущество: исходные тексты
функций предоставлены, вы можете модифицировать их по своему
усмотрению.
Экранное окно
-----------------------------------------------------------------
Окном называется область экрана дисплея, которая
используется для определенных целей. Окно обычно имеет форму
прямоугольника или квадрата, а его границей служат символы из
набора графических символов. Использование окон становится
наиболее популярным способом представления информации,
предназначенной для восприятия пользователем ПЭВМ. Этот способ
позволяет на ограниченном пространстве экрана отображать
информацию, передаваемую множеством задач, выполняющихся
асинхронно.
Поскольку отображаемые на экране изображения формируются в
видеопамяти с прямым доступом процессора (так называемый способ
формирования изображения путем управления содержимым памяти),
то окна на экране создаются мгновенно, возникая как бы из
ничего, и так же мгновенно исчезают. Использование окон в
программах позволяет очень удобно отображать различного рода
информацию. Окна появляются и сменяют друг друга: они
появляются на экране, когда это необходимо, и исчезают после
того, как информация, которую они содержат, становится вам
ненужной. Программа может отображать столько окон, сколько
нужно программисту. Окна могут иметь различные размеры, цвета и
форматы. Вы можете разместить окно в любом месте экрана, где это
необходимо. Если окно становится ненужным, то вы можете удалить
его, и окно исчезнет, а на его месте будет то, что было до его
появления.
Каждый, кто занимался проблемами автоматизации в последние
годы, обязательно сталкивался с окнами. ПЭВМ IBM PC сейчас
встречаются везде, в любой сфере общественной и деловой жизни. И
почти на каждой из них работает вездесущая программа Sidekick,
включающая калькулятор, календарь и средства вызова абонента в
сети. Каждый из этих компонентов отображает свою информацию с
помощью окон, которые по мере необходимости появляются и
исчезают на экране, не разрушая того изображения, которое было до
их появления. Волшебники в области разработки программного
обеспечения и ее сбыта из фирмы Bоrland International (это они
дали Вам Турбо Си) внедрили окна во всеобщую практику. Если вы
никогда не видели окон, то отложите книгу в сторону, найдите
IBM PC и нажмите одновременно клавиши и . Если вы не
увидите после этого красно-бело-зелено-голубого окна на экране
(или зеленого и черного для монохромного экрана), то спросите у
владельца машины, почему у него не работает программа Sidekick.
Если же окно небольшого размера все-таки появится, начните с ним
игру. Сделав выбор в меню, содержащемся в первом окне, вы можете
создать другое окно. Вы можете перемещать окна, нажимая клавишу
со стрелкой. Вы можете удалять окна, нажимая клавишу . Вы
можете вызвать на экран справочную информацию по работе с
программой, нажав клавишу .
Из этого раздела вы узнаете, как работать с окнами, как
накладывать их друг на друга, как перемещать их по экрану и как
их использовать в своих программах, разрабатываемых с помощью
Турбо Си. Окна используются для отображения меню, информационных
и предупреждающих сообщений, текстовых файлов, шаблона для ввода
данных и контекстно-чувствительных информационных сообщений.
Программные системы могут использовать окна для отображения
информации независимо от содержания других окон и размера области
пространства экрана, занимаемой другими окнами. Благодаря этому
можно обозревать на экране несколько окон, даже если каждое из
них занимает больше половины экрана, потому что окна могут как бы
"всплывать" друг над другом.
Свойство всплывания окон часто объясняют путем сравнения
экрана дисплея с поверхностью стола. Допустим, на вашем столе
лежит множество документов, но в каждый момент времени вы можете
работать только с одним из этих документов, возможно, наиболее
важным для вас. То, что можно делать с бумагами, можно выполнять
и на экране дисплея. Если первоначально изображение на экране
содержит только одно окно, как это показано на рис. 5.1, и
программе необходимо создать второе окно, не уничтожая при этом
первого, то в результате получится изображение, как на рис. 5.2.
Если затем второе окно становится ненужным, то оно уничтожается,
и изображение снова будет соответствовать рис. 5.1.
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬
¦ ¦
¦ ¦
¦ ЪДДДДДДДДДДДДДДДДДДДДДДДДДД¬ ¦
¦ ¦ ¦ ¦
¦ ¦ ¦ ¦
¦ ¦ ¦ ¦
¦ ¦ ¦ ¦
¦ ¦ Окно A ¦ ¦
¦ ¦ ¦ ¦
¦ ¦ ¦ ¦
¦ ¦ ¦ ¦
¦ ¦ ¦ ¦
¦ АДДДДДДДДДДДДДДДДДДДДДДДДДДЩ ¦
¦ ¦
¦ ¦
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Рис. 5.1 Экранное окно
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬
¦ ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬ ¦
¦ ¦ ¦ ¦
¦ ¦ ¦ ¦
¦ ЪДДДДДДДДДДДґ ¦ ¦
¦ ¦ ¦ Окно B ¦ ¦
¦ ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ ¦
¦ ¦ Окн¦ ¦ ¦
¦ ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ ¦
¦ ¦ АДДДДДДДДДДДДДДВДДДДДДДДДДДДДЩ ¦
¦ ¦ ¦ ¦