пользователем элементов этого меню отображается в акцентированном
цвете функцией light.
Функция getmenu анализирует прерывания от клавиатуры при
выборе элементов меню или при передвижении курсора по меню. Если
пользователь нажал клавишу перемещения курсора вправо или влево,
то вызывается функция haccent для перемещения курсора по
меню-строке. Если пользователь нажал клавишу <КЛЮЧ> (), то
функция getmenu возвращает 0. При нажатии клавиши <ВВОД> ()
функция возвращает значение, соответствующее выбранному элементу
меню, и передает управление в точку ее вызова.
Функция getvmn предназначена для обработки вертикального
меню, "всплывшего" под соответствующим элементом горизонтального
меню. Вертикальное меню представляет собой окно, а его состав
определяется в соответствии с таблицей MENU. Функция
get_selection (см. Главу 6) вызывается для считывания
пользовательского выбора. После того, как в вызывающую программу
передано значение выбранного пользователем элемента меню, окно,
выделяемое для "всплывающего" меню, уничтожается. При нажатии
пользователем клавиш перемещения курсора вправо или влево
вызывается функция haccent для перемещения вперед или назад
курсора по элементам горизонтального меню-строки, а обработка
вновь появляющихся (в процессе перемещения курсора по
горизонтальному меню) вертикальных меню осуществляется опять
функцией getvmn; в противном случае значение, возвращаемое
функцией get_selection приводит к возврату управления в точку
вызова функции getvmn.
Пример оконного меню
-----------------------------------------------------------------
Листинги 10.2, 10.3 и 10.4 содержат пример программы,
иллюстрирующей использование и обработку меню. Этот пример строит
меню, позволяющее выполнять в рамках одной интегрированной
системы все оконные функции, рассмотренные в качестве
примеров, иллюстрирующих содержание глав с шестой по девятую.
Листинг 10.2, программа menu.c, является простейшей
управляющей программой, которая вызывает программу, реализующую
пример (exec.c) и представленную листингом 10.3. Листинг 10.4
программы menu.prj является make-файлом Турбо Си, по которому
строится выполняемая программа, реализующая пример.
Листинг 10.2:menu.c
/* ------------------menu.c-------------------*/
#include "twindow.h"
void exec(void);
char notefile [] = "note.pad";
main()
{
load_help("tcprogs.hlp");
exec();
}
Листинг 10.3:exec.c
/* ----------------exec.c------------------- */
#include
#include "twindow.h"
/* ----------Локальные прототипы----------- */
void testmove(void);
void promote(void);
void ccolor(void);
void fasttest(void);
void notepad(void);
void ordent(void);
void poems(void);
void maxims(void);
/* -----------Таблицы меню------------------ */
char *dselcs[] = {
" move ",
" promote ",
" colors ",
" fast ",
NULL
};
char *pselcs[] = {
" notepad ",
" orders ",
" poetry ",
" sayings ",
NULL
};
static void (*dfuncs[])()={testmove,promote,ccolor,fasttest};
static void (*pfuncs[])()={notepad,ordent,poems,maxims};
static MENU tmn [] = {
{" demos ", dselcs, dfuncs},
{" programs ", pselcs, pfuncs},
{NULL,NULL,NULL}
};
void exec()
{
menu_select(" TC Executive ", tmn);
}
Листинг 10.4:menu.prj
menu.c
exec.c (twindow.h, keys.h)
testmove (twindow.h, keys.h)
promote (twindow.h, keys.h)
ccolor (twindow.h, keys.h)
fasttest (twindow.h)
notepad (twindow.h)
ordent (twindow.h)
maxims (twindow.h, keys.h)
poems (twindow.h, keys.h)
editor (twindow.h, keys.h)
entry (twindow.h, keys.h)
thelp (twindow.h, keys.h)
tmenu (twindow.h)
twindow (twindow.h, keys.h)
ibmpc.obj
Для запуска программы-примера введите следующую команду:
C>MENU
Вид экрана дисплея, изображенный на рисунке 10.2, будет
соответствовать ситуации, когда на экране отображается скользящее
меню-строка. В этом примере доступны для выбора только два
элемента меню, однако скользящее меню-строка может включать в
себя до шести элементов, доступных для выбора пользователем.
Обратимся теперь к массиву структур MENU, поименованному как
tmn (см. листинг 10.3 программы exec.c). Массив содержит лишь два
элемента, соответствующих элементам горизонтального меню,
отображаемых пользователю. Структура MENUI определена в twindow.h
(см. Главу 6) и включает три элемента: указатель на имя
выбранного элемента меню, указатель на массив имен элементов
"всплывающего" меню, соответствующего элементу горизонтального
меню, и указатель на массив указателей функции, реализующей ту
или иную операцию.
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬
¦ЪДДДДДДДДДДДДДДДДДДДДДД TC Executive ДДДДДДДДДДДДДДДДДДДДДДДД¬¦
¦¦ demos programs ¦¦
¦АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ¦
¦ ¦
¦ ¦
¦ ¦
¦ ¦
¦ ¦
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Рис. 10.2 Горизонтальное скользящее меню.
Для перемещения по меню с целью выборки нужного элемента из
горизонтального меню используются клавиши перемещения курсора
вправо и влево. Если текущим является элемент меню demos, нажмите
клавишу <Ввод>. Теперь вы можете увидеть на экране картинку,
аналогичную изображенной на рисунке 10.3, на котором также
изображено и вертикальное меню, соответствующее элементу
горизонтального меню demos. Теперь вернемся к листингу 10.3 и
обратим внимание на содержимое первого элемента массива tmn,
который соответствует элементу горизонтального меню demos. Здесь
dselcs - адрес, указывающий размещение массива указателей типа
char на имена элементов demosвертикального "всплывающего" меню,
dfuncs - адрес размещения массива указателей функций. Каждый из
указателей этого массива адресует одну из функций, которые
рассматривались в качестве примеров в предыдущих главах. Для
перемещения по вертикальному меню применяются клавиши перемещения
курсора вверх и вниз. Если вы остановились на каком-то выборе,
нажмите клавишу <Ввод>. После этого будет выполнена одна из
функций в зависимости от того, какой элемент меню вы выбрали.
После передачи управления из этой функции в точку ее вызова (как
было показано в этой главе, для функций, требующих какого-либо
выбора от пользователя, это клавиша , на экране
восстанавливается изображение горизонтального и вертикального
меню в том состоянии, которое предшествовало вызову функции, и
разрешена дальнейшая работа с ними. Для уничтожения текущего
вертикального меню нажмите клавишу . Для выхода из программы
и уничтожения горизонтального меню требуется повторное нажатие
клавиши .
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬
¦ЪДДДДДДДДДДДДДДДДДДДДДД TC Executive ДДДДДДДДДДДДДДДДДДДДДДДД¬¦
¦¦ demos programs ¦¦
¦АВДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ¦
¦ ¦ move ¦ ¦
¦ ¦ promote ¦ ¦
¦ ¦ colors ¦ ¦
¦ ¦ fast ¦ ¦
¦ АДДДДДДДДДЩ ¦
¦ ¦
¦ ¦
¦ ¦
¦ ¦
¦ ¦
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Рис. 10.3 "Всплывающее" вертикальное меню
Резюме
-----------------------------------------------------------------
Итак, описание библиотеки функций оконной технологии
завершено. Они позволяют поддерживать программное обеспечение на
таком профессиональном уровне развития, для которого традиционно
использовались возможности, предоставляемые фирмами-поставщиками
библиотек оконной поддержки, изучение которых требовало много
времени, да и цена их была побольше, чем стоимость этой книги.
Версия описанного в этой книге пакета программ может быть
использована для дальнейшего комплексного развития программных
систем, после чего эти системы не требуют какой-то дополнительной
перенастройки в связи с мобильностью программ, составляющих
описываемый пакет.
В следующей главе будут рассмотрены резидентные утилиты.
Функции поддержки окон, описанные в этой книге, могут быть
включены в обычные однозадачные программы, выполняемые в среде
DOS, или могут быть преобразованы в программы, которые постоянно
находятся в памяти, и инициализация их выполнения закрепляется за
определенными клавишами. Технические приемы написания таких
программ (они еще носят название резидентных программ или
резидентных утилит), а также примеры их использования при
разработке систем рассматриваются в следующих главах.
Г Л А В А 11
Резидентные программы
-----------------------------------------------------------------
Повсюду в этой книге "PC" (ПК) относится к семейству IBM PC
и совместимым с ними компьютерам; однако персональные компьютеры
не всегда были такими, как PC. Первые ПК создавались на знаниях и
интересе любителей. ПК развивались вместе с развитием
микрокомпьютерной технологии от домашних игрушек до серьезных
систем. Программное обеспечение и операционные системы
развивались вместе с компьютерами. Ранние операционные системы
(ОС) представляли собой немногим более, чем командные процессоры
Бейсика или Паскаля, которые обеспечивали поддержку языков и
простое управление файлами. Эти системы обычно ориентировались на
конкретный компьютер и были несовместимы с другими. Когда
компьютеры начали ориентироваться на массовое применение,
операционные системы начали стабилизироваться. Среди них были
Apple-DOS, NorthStar DOS, TRSDOS, и CP/M. Все они имели похожие
характеристики:
- однопрограммный однопользовательский режим работы
- поддержка файлового каталога
- поддержка интерпретаторов и компиляторов языков
программирования
- несовместимость программ и данных между системами
С великой проницательностью Гарри Килдалл создал CP/M как
открытую ОС. Изначально предназначавшаяся для поддержки создания
программ для Intel MDS, эта ОС не ориентирована на какую-либо
модель или марку компьютеров. CP/M состоит из базовой системы
ввода-вывода (BIOS), базовой дисковой операционной системы
(BDOS), и командного процессора (CCP). BIOS ориентирована на
работу с аппаратурой компьютера и предназначена для управления
консолью, принтером и дисковой системой. Путем написания